我有一个存储十六进制的char数组
char peer0_0[] = {0xc1, 0x02, 0x06, 0x08, 0x00, 0x5e, 0x84};
我尝试在日志中读取值
std::stringstream ss2;
ss2 << std::hex;
for (int i(0) ; i<8 ; ++i)
ss2 << (int)peer0_0[i] << ' ';
m_manager->log(ss2.str(),HIGH_IMPORTANCE);
结果是
ffffffc1 2 6 8 0 5e ffffff84 0
我不明白为什么它只在两个值之前附加'ffffff'而不是其他值?为什么最后会出现零?这是一个阅读问题吗?请帮忙。
答案 0 :(得分:3)
f
来了,因为你转向int
并且这两个数字的顶部位设置,即它们是负数并且“符号扩展”以产生32位整数。
最后的0
实际上是未定义的行为:你在循环中打印8个数字,但在你的数组中只有7个。
答案 1 :(得分:1)
问题是您的编译器默认将类型char
视为signed char
。在这种情况下,例如值
0xc1
被视为负数,因为符号位已设置。
您可以将数组定义为
unsigned char peer0_0[] = {0xc1, 0x02, 0x06, 0x08, 0x00, 0x5e, 0x84};
或者您可以显式地将数组的每个元素转换为unsigned char
for ( size_t i = 0 ; i < sizeof( peer0_0 ) ; ++i )
ss2 << (int)static_cast<unsigned char>( peer0_0[i] ) << ' ';
考虑到你的数组只有7个元素。
答案 2 :(得分:0)
您可以使用std :: setw函数来限制打印数字的大小。
std::stringstream ss2;
ss2 << std::hex << std::setfill('0');
for (int i = 0; i < 8; ++i)
{
ss2 << std::setw(2) << static_cast<int>(peer0_0[i]) << ' ';
}
std::cout << ss2.str() << std::endl;