ostream.write将额外的字节写入缓冲区

时间:2013-05-14 21:58:41

标签: c++ iostream

我正在使用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被写入缓冲区。

1 个答案:

答案 0 :(得分:3)

即使ss.c_str()[i]的类型为charprintf也会将其参数提升为int,因此额外的FFFFFF来自促销类型{ {1}}。请尝试int告诉"%02hhX"将其转换为printf

另一个解决方案是unsigned char将其屏蔽掉。另请注意,ss.c_str()[i] & 0xFF可以简化为ss.c_str()[i]

您的代码中发生的事情称为sign extension