十六进制数组到int

时间:2012-01-25 21:57:17

标签: c

我在这里做错了什么?

#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

5 个答案:

答案 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]评估为0x1117十进制)

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];