我正在尝试使用 C++ 将 4 个字节转换为整数。
这是我的代码:
int buffToInteger(char * buffer)
{
int a = (int)(buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]);
return a;
}
上面的代码几乎适用于所有情况,例如:当我的缓冲区是: "[\x00, \x00, \x40, \x00]"
代码将按预期返回 16384
。
但是当缓冲区填充: "[\x00, \x00, \x3e, \xe3]"
时,代码将无法按预期工作,并将返回 "ffffffe1"
。
有谁知道为什么会这样?
原文由 Y. Franco 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的
buffer
包含 签名 字符。 So, actually,buffer[0] == -29
, which upon conversion toint
gets sign-extended to0xffffffe3
, and in turn(0x3e << 8) | 0xffffffe3 == 0xffffffe3
.You need ensure your individual
buffer
bytes are interpretedunsigned
, either bybuffer
asunsigned char *
, or by explicitly casting: