字节数组转成16进制表示

来源:互联网 发布:centos入门到精通 编辑:程序博客网 时间:2024/06/04 18:50

网络程序经常要比对收到的数据,用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();}

 

原创粉丝点击