字节数组转成16进制表示

时间:2021-09-07 22:43:40

网络程序经常要比对收到的数据,用16进制字符串表示比较容易。

下面是代码:

string PrintByteArrayAsHexString(vector<char> const& v) {
stringstream stream;
stream << std::hex << std::uppercase << std::setfill('0');
size_t size = v.size();
for (size_t i = 0; i < size; ++i) {
stream << std::setw(2) << static_cast<uint32_t>(v[i]);
}
return stream.str();
}

上面的代码有点地方需要进一步完善。

v[i]类型转换时变成了32位非负整数,如果系统理解v[i]成一个字节的负整数,则类型转换时会将符号位1一直向左填充,结果就会出现一个和原来不同的大数。比如

10进制整数200 作为char传递进来,其16进制数为C8,但是最终变成了FFFFFFC8, 也就是10进制:4294967240


因此要做一按位与操作,去除高位的1。

string PrintBytesAsHexString(vector<char> const& v, size_t size) {  stringstream stream;  stream << std::hex << std::uppercase << std::setfill('0');  for (size_t i = 0; i < size; ++i) {    stream << std::setw(2) << (static_cast<uint32_t>(v[i]) & 0xff) << " ";  }  return stream.str();}