将unsigned char *转换为hexstring

时间:2018-05-22 09:56:04

标签: c++ bitwise-operators stringstream

下面的代码采用十六进制字符串(每个字节表示为其对应的十六进制值) 将其转换为unsigned char * buffer,然后转换回十六进制字符串。 此代码测试从unsigned char * buffer到hex string的转换 我需要通过网络发送到接收器进程。 我选择了十六进制字符串,因为unsigned char可以在0到255的范围内,127之后没有可打印的字符。 下面的代码告诉我错误的部分。它在评论中。

seekg()

1 个答案:

答案 0 :(得分:1)

unsigned char的输出类似于char的输出,这显然不是OP所期望的。

我在coliru上测试了以下内容:

#include <iomanip>
#include <iostream>

int main()
{
  std::cout << "Output of (unsigned char)0xc0: "
    << std::hex << std::setw(2) << std::setfill('0') << (unsigned char)0xc0 << '\n';
  return 0;
}

得到了:

Output of (unsigned char)0xc0: 0�

这是由可用运算符中选择的std::ostream::operator<<()引起的。我查看了cppreference

找到了

template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
                                        unsigned char ch );

在前者(在M.M的帮助下)。

OP提出了一个解决方案:按位并且0xff似乎有效。在coliru.com中检查:

#include <iomanip>
#include <iostream>

int main()
{
  std::cout << "Output of (unsigned char)0xc0: "
    << std::hex << std::setw(2) << std::setfill('0') << (0xff & (unsigned char)0xc0) << '\n';
  return 0;
}

输出:

Output of (unsigned char)0xc0: c0

真的,这似乎有效。为什么呢?

0xffint常量(严格来说:integer literal)并且类型为int。因此,逐位并将(unsigned char)0xc0提升为int,产生类型int的结果,因此应用std::ostream::operator<<的{​​{1}}

这是解决此问题的选项。我可以提供另一个 - 只需将int转换为unsigned char

unsigned促销unsigned char引入了可能的符号位扩展(在这种情况下是不受欢迎的),当int转换为unsigned char时,这不会发生unsignedunsigned的输出流运算符也提供了预期的输出:

#include <iomanip>
#include <iostream>

int main()
{
  std::cout << "Output of (unsigned char)0xc0: "
    << std::hex << std::setw(2) << std::setfill('0') << (unsigned)(unsigned char)0xc0 << '\n';
  const unsigned char c = 0xc0;
  std::cout << "Output of unsigned char c = 0xc0: "
    << std::hex << std::setw(2) << std::setfill('0') << (unsigned)c << '\n';
  return 0;
}

输出:

Output of (unsigned char)0xc0: c0
Output of unsigned char c = 0xc0: c0

Live Demo on coliru