C++ 将字符字节转换为整数值

C++ 将字符字节转换为整数值,c++,C++,例如,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 +

例如,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;
}
除非我改变主意

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

然后它将得到正确的结果

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

将数组定义为:

unsigned char buf[3];
记住char可以被签名


更新:为了完成回答,有趣的是添加char是一种可以等效于有符号char或无符号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;

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

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

这将防止变窄转换。你的编译器应该给你一个警告。

你知道endianess吗?你实际上是在假设一个大端格式。@πάνταῥεῖ 好的一点,尽管他计算整数的方式与endianness无关。我假设他是指手写的十六进制表示如果字符有符号,第三个字符将是一个大的负数number@M.M哦,是的。我的错。谢谢
int number = ((buf[0] << 16) & 0xff0000)
           | ((buf[1] <<  8) & 0x00ff00)
           | ((buf[2] <<  0) & 0x0000ff;
unsigned char[3] = { 0x13, 0x0A, 0xBF };