用于字节解析的指针上的哪种类型?

时间:2013-04-14 07:51:10

标签: c++ pointers casting type-conversion

我正在开发一个C ++ - Addon for nodejs,它接受一个nodejs Buffer对象并对其进行一些二进制操作。我目前的问题是关于指针背后的数据:

JavaScript环境:

var buf = new Buffer([0x00, 0x7e, 0xff, 0xff]);

C ++后端代码

int length = node::Buffer::Length(chunk);
char* head = node::Buffer::Data(chunk);

/* for debugging */
for (int i = 0; i < length; i++) {
    std::cout << hex << (int) head[i] << "\n";
}

/* outputs: 0x00 0x7e 0xffffffff 0xffffffff */

为什么指针将最后两个字节解释为0xffffffff而不是0xff? 我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

char是签名类型,这意味着0xff为-1,将int转换为-1,表示为0xffffffff。< / p>

你可以这样解决:

std::cout << hex << (unsigned) (unsigned char) head[i] << "\n";

答案 1 :(得分:1)

问题是您的平台默认签署了char,因此(char)0xFF-1

只需写下:

std::cout << hex << (int)(unsigned char)head[i] << "\n";

有时写下来很有用:

typedef unsigned char byte;

然后:

std::cout << hex << (int)(byte)head[i] << "\n";

答案 2 :(得分:1)

这是因为这种类型转换:(int) head[i]。它将您的结果转换为signed int。 0xff是-1(作为有符号字符),作为signed int是0xfffffff。

答案 3 :(得分:1)

只是因为值是从1字节到4字节的算术扩展,0xff表示-1(一个字节),而0xffffffff仍然是-1(4字节),为此需要使用“unsigned char”,如你的“头”阵列。