我正在使用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
被写入缓冲区。
答案 0 :(得分:3)
即使ss.c_str()[i]
的类型为char
,printf
也会将其参数提升为int
,因此额外的FFFFFF
来自促销类型{ {1}}。请尝试int
告诉"%02hhX"
将其转换为printf
。
另一个解决方案是unsigned char
将其屏蔽掉。另请注意,ss.c_str()[i] & 0xFF
可以简化为ss.c_str()[i]
。
您的代码中发生的事情称为sign extension。