例如, 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 类型,有人知道如何解决这个问题吗?
答案 0 :(得分:7)
将数组定义为:
unsigned char buf[3];
请记住,char可以签名。
更新:为了完成答案,有趣的是添加“char”是一种类型,可以等同于“signed char”或“unsigned char”,但它不是由标准决定的。
答案 1 :(得分:1)
在评估之前,数组元素将被提交给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;
答案 2 :(得分:0)
由于您的char数组已签名,因此当您要初始化最后一个元素(0xBF
)时,您尝试为其分配191,而它可以存储的最大值为127:发生缩小转换...解决方法如下:
unsigned char[3] = { 0x13, 0x0A, 0xBF };
这样可以防止缩小转换。你的编译器应该给你一个警告。