【问题标题】:Which type on pointer for byte parsing?哪种类型的指针用于字节解析?
【发布时间】:2013-04-14 07:51:10
【问题描述】:

我正在为 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? 我该如何解决这个问题?

【问题讨论】:

    标签: c++ pointers casting type-conversion


    【解决方案1】:

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

    你可以这样修复它:

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

    【讨论】:

    • char 可能或可能不是是有符号类型。它恰好是在这个特定的系统上签名的。
    【解决方案2】:

    问题是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";
    

    【讨论】:

    • &lt;cstdint&gt; 中已经有一个不错的类型:uint8_t。无需添加byte 类型别名。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      只是因为该值在算术上从 1 个字节扩展到 4 个字节,0xff 表示 -1(一个字节),而 0xffffffff 仍然表示 -1(4 个字节),为此您必须使用“unsigned char”,如你的“头”数组。

      【讨论】:

        猜你喜欢
        • 2017-08-10
        • 2018-08-31
        • 2013-04-05
        • 2020-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        相关资源
        最近更新 更多