我在这里做错了什么?
#include <stdio.h>
int main() {
unsigned char buff[3];
buff[0] = 0x00;
buff[1] = 0x11;
buff[2] = 0x00;
buff[3] = 0x00;
int var = (buff[0]<<24)|buff[1]|buff[2]|buff[3];
printf ("%u\n", var);
return 0;
}
结果如下所示,
$./a.out
17
答案 0 :(得分:2)
嗯。 char[3]
是一个包含3个字符的数组,其合法索引为0,1和2。
您所指的buff[3]
必须完全不同,甚至可能在buff[3] = 0x00
分配后重新初始化。您可能会获得SIGSEGV或GPF而不是17。
答案 1 :(得分:1)
你可能想要:
int var = (buff[0]<<24)|(buff[1]<<16)|(buff[2]<<8)|buff[3];
如果您的缓冲区为big-endian或
int var = buff[0]|(buff[1]<<8)|(buff[2]<<16)|(buff[3]<<24);
如果您的缓冲区为little-endian。
此外,您的数组太少 - 声明数组时在括号中指定的数字是数组的 size ,而不是最大索引。它必须是unsigned char buff[4];
。
答案 2 :(得分:1)
---编辑以回应9000的观察---
除了下面提到的移位之外,还应该分配一个足够大的数组来覆盖所有使用的索引
unsigned char buff[4];
我的结果(下面复制的整个程序)是1116160,对应于0x00110000
#include <stdio.h>
int main() {
unsigned char buff[4];
buff[0] = 0x00;
buff[1] = 0x11;
buff[2] = 0x00;
buff[3] = 0x00;
int var = (buff[0]<<24)|(buff[1]<<16)|(buff[2]<<8)|buff[3];
printf ("%u\n", var);
return 0;
}
根据机器的字节顺序,您的结果可能略有不同。
---原帖如下---
最后三个字节相互重叠。你只是忘了将它们移到适当的位置。
假设这是一个很好的假设,你的代码看起来应该更像
int var = (buff[0]<<24)|(buff[1]<<16)|(buff[2]<<8)|buff[3];
printf ("%u\n", var);
return 0;
答案 3 :(得分:1)
(buff[0]<<24)
评估为0
buff[1]
评估为0x11
(17
十进制)
buff[2]
评估为0
buff[3]
评估为0
0 | 17 | 0 | 0 == 17
答案 4 :(得分:0)
由于你还没有说明结果应该是什么,我会走出困境,猜测这就是问题所在:
int var = (buff[0]<<24)|buff[1]|buff[2]|buff[3];
应该是
int var = (buff[0]<<24)|(buff[0]<<16)|(buff[0]<<8)|buff[3];