在 unsigned char 的 std::vector 处存储 int 的十六进制表示

Storing hexadecimal representation of int at std::vector of unsigned char

在此代码中:

  vector<unsigned char> result;
  int n;
  unsigned char c;

  c = (n >> 24) & 0xFF;
  result.push_back(c);
  c = (n >> 16) & 0xFF;
  result.push_back(c);
  c = (n >> 8) & 0xFF;
  result.push_back(c);
  c = n & 0xFF;
  result.push_back(c);

我想要,而不是将一个字节添加到向量 (c),添加整数 n 的十六进制表示的每一位(例如 FF 之类的东西0xFF).

任何人都可以提示如何完成它?

更新

我将我的代码更新为这个,它适用于除 0 和 1 之外的大多数值(十六进制表示保留一位和一位 space:“0”和“1”)。

  BYTE c;

  vector<BYTE> v_version;
  c = (version >> 24) & 0xFF;
  v_version.push_back(c);
  c = (version >> 16) & 0xFF;
  v_version.push_back(c);
  c = (version >> 8) & 0xFF;
  v_version.push_back(c);
  c = version & 0xFF;
  v_version.push_back(c);

  for (auto c: v_version)
  {
    ostringstream oss;
    oss << hex << static_cast<int>(c);
    result.push_back( oss.str()[0] );
    result.push_back( oss.str()[1] );
  }

n 未初始化,因此请先处理它。

根据您的最终目标,最好的解决方案不是存储十六进制数字,而是保留当前的二进制表示形式并以十六进制打印。为此,您需要 std::hex 和一个整数转换:

std::cout << std::hex << std::setw(2) << std::setfill('0');
std::cout << static_cast<unsigned>(c);

如果您想存储结果而不是打印结果,您可以像示例中那样使用 ostringstream 来完成。但我强烈建议 std::stringstd::vector<char>。尽管它的名字 unsigned char 不应该与字符一起使用。如果你有像这里这样的字符,底层类型应该是 char.

  • 对字符使用char
  • 使用 unsigned char 作为原始内存(字节)
  • 不要使用 signed char