c ++十六进制数组附加字符

时间:2014-10-30 11:53:45

标签: c++

我有一个存储十六进制的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'而不是其他值?为什么最后会出现零?这是一个阅读问题吗?请帮忙。

3 个答案:

答案 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;