在无符号字符的 std::vector 处存储 int 的十六进制表示

Posted

技术标签:

【中文标题】在无符号字符的 std::vector 处存储 int 的十六进制表示【英文标题】:Storing hexadecimal representation of int at std::vector of unsigned char 【发布时间】:2020-07-06 00:33:01 【问题描述】:

在这段代码中:

  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 之外的大多数值(十六进制表示保留一位数字和一个空格:“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] );
  

【问题讨论】:

【参考方案1】:

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

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

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

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

对字符使用charunsigned char 用于原始内存(字节) 不要使用signed char

【讨论】:

我不需要显示值(使用cout);我有一个带有intstring 类型元素的结构(示例显示int元素,string 已经是十六进制表示)并且需要生成一个无符号字符向量作为该方法的返回值。 @KleberMota 那么为什么您的问题会显示完全不同的内容?请edit您的问题与您实际拥有的代码以及您实际想要做的事情。在您的问题中,您没有提到现有的string 字符串在这里不相关,我只想将int 转换为其十六进制表示。问题中的代码是我现在正在使用的,并且想要调整以获得所需的结果。 你想如何存储它? (什么类型的?) 就像问题中的代码所示,我将每个字符推送到向量result

以上是关于在无符号字符的 std::vector 处存储 int 的十六进制表示的主要内容,如果未能解决你的问题,请参考以下文章

仅在发布模式下将 __m256i 存储在 std::vector 中会产生访问冲突[重复]

将负数存储在无符号整数中[关闭]

C++ 获取std::vector 长度 大小

奇怪的 std::vector::reverse_iterator 和字符串行为

std::size_t 还是 std::vector<Foo>::size_type?

gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误