0

我正在为 nodejs 开发一个 C++-Addon,它采用 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

4 回答 4

3

char是有符号类型,表示a0xff为-1,转换为-1为int,表示为0xffffffff

你可以像这样修复它:

std::cout << hex << (unsigned) (unsigned char) head[i] << "\n";
于 2013-04-14T07:53:25.177 回答
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";
于 2013-04-14T07:54:52.127 回答
1

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

于 2013-04-14T07:57:46.797 回答
1

仅仅因为该值在算术上从 1 个字节扩展到 4 个字节,0xff 表示 -1(一个字节),而 0xffffffff 仍然表示 -1(4 个字节),为此您必须使用“unsigned char”作为您的“head “ 大批。

于 2013-04-14T07:58:03.353 回答