0

通过在 c++ 中使用文件流,我已将二进制文件中的字符串读入缓冲区(4 个字节)。我知道缓冲区包含“ 89abcdef”。缓冲区是这样的:

buffer[0] = 89
buffer[1] = ab
buffer[2] = cd
buffer[3] = ef

现在,我想将这些数字恢复为一个十六进制数字0x89abcdef。然而,这并不像我想象的那么简单。我尝试了以下代码:

int num = 0;
num |= buffer[0];
num <<= 24;
cout << num << endl;

此时,num显示为

ea000000

当我对缓冲区的第二个元素尝试相同的算法时:

num = 0;
num |= buffer[1];
num <<= 16;
cout << num << endl;

输出:

ffcd0000

ff前面的对cd我来说将它们全部加在一起非常不方便(我打算让它看起来像00cd0000,然后将它添加到第一个num)。

谁能帮我恢复十六进制数0x89abcdef?谢谢。

4

2 回答 2

4

直到最后不要修改实际数字:

num = buffer [0] << 24 | buffer [1] << 16 | buffer [2] << 8 | buffer [3];

buffer [0] << 24给你你的第一个结果,它与独立于第一个结果的第二个结果相结合,依此类推。

此外,正如所指出的,应该对无符号数字进行这样的操作,以便签名不会干扰结果。

于 2012-06-14T18:52:41.110 回答
2

对于所有按位运算,您将要使用 unsigned int 而不是 int。通过这种方式,您可以避免遇到的各种符号扩展问题。

于 2012-06-14T18:53:37.727 回答