1

我正在使用 ostream 来序列化一个对象,但是 write() 方法似乎将额外的字节写入缓冲区。

uint32_t id1=0x01;
uint32_t id2=0xdeadbeef;
std::stringstream sink;
sink.write(reinterpret_cast<char *>(&id1),sizeof(uint32_t));
print(sink); //01000000 - Correct
sink.write(reinterpret_cast<char *>(&id2),sizeof(uint32_t));
print(sink); //FFFFFFEFFFFFFFBEFFFFFFADFFFFFFDE - why?!

//print defined as follows:
static void print(std::ostream &sink){
    std::stringstream sk;
    sk << sink.rdbuf();
    std::string ss=sk.str();
    for(unsigned int i=0;i<ss.length();i++){
        printf("%02X", ss.c_str()[i]);
    }
}

我很困惑为什么那些FFFF被写入缓冲区。

4

1 回答 1

3

即使ss.c_str()[i]is 属于 type char,也printf将其参数提升为 type int,因此额外FFFFFF的内容来自提升到 type int。尝试"%02hhX"告诉printf将它们转换为unsigned chars。

另一种解决方案是ss.c_str()[i] & 0xFF屏蔽它们。另外,请注意,ss.c_str()[i]可以简化为ss[i].

您的代码中发生的事情称为符号扩展

于 2013-05-14T22:44:19.090 回答