将字符字节转换为整数值

Convert char byte to integer value

本文关键字:整数 转换 字符 字节      更新时间:2023-10-16

例如,130ABF(十六进制)等于1247935,所以我的字节数组是

 char buf[3] = {0x13 , 0x0A , 0xBF};

我需要从字节数组中检索十进制值。

以下是我的示例代码:

#include<iostream>
using namespace std;
int main()
{
    char buf[3] = {0x13 , 0x0A , 0xBF};
    int number = buf[0]*0x10000 + buf[1]*0x100 + buf[2];
    cout<<number<<endl;
    return 0;
}

结果是:(错误)

1247679

除非我更改

char buf[3] = {0x13 , 0x0A , 0xBF};

int buf[3] = {0x13 , 0x0A , 0xBF};

那么它将得到正确的结果。

不幸的是,我必须将我的数组设置为char类型,有人知道如何解决这个问题吗?

将数组定义为:

unsigned char buf[3];

请记住,char是可以签名的。

更新:为了完成答案,有意思的是添加"char"是一种类型,可以等效于"signed char"或"unsigned char",但它不是由标准确定的。

在评估之前,数组元素将被提升到int。因此,如果您的编译器将char视为已签名,那么您将得到下一个(假设int是32位):

int number = 19*0x10000 + 10*0x100 + (-65);

为了避免这种影响,您可以将数组声明为unsigned char arr[],或者使用掩码加移位:

int number = ((buf[0] << 16) & 0xff0000)
           | ((buf[1] <<  8) & 0x00ff00)
           | ((buf[2] <<  0) & 0x0000ff;

由于您的char数组已签名,当您想要初始化最后一个元素(0xBF)时,您正试图将191分配给它,而它可以存储的最大值是127:发生了缩小转换。。。解决方法如下:

unsigned char[3] = { 0x13, 0x0A, 0xBF };

这将防止缩小转换范围。你的编译器应该给你一个警告。