我正在开发一个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? 我该如何解决这个问题?
答案 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”,如你的“头”阵列。