将十六进制字符串转换为字符数组 c++

Convert string of hex to char array c++

本文关键字:字符 数组 c++ 转换 十六进制 字符串      更新时间:2023-10-16

>我有一个表示十六进制数的字符串:

std::string hex = "3371";

我想将其转换为字符数组:

char hex[2] {0x33, 0x71};

有什么方便的方法吗?如果有帮助的话,我可以使用 c++11 功能。

赋予动机:我需要使用 4 字节 char 数组保存一个整数(2 字节)。我认为可以完成的方法是使用 std::hex 将其转换为字符串,然后将字符串转换为 char 数组,但这是我无法继续的地方。如果有另一种简单的方法 - 我想听听:)

重要提示:我可以假设十六进制数小于 0xFFFF,并且是一个正数。

只需使用 std::stoi():

std::string hex = "3371";
uint16_t num = std::stoi( hex, nullptr, 16 );
uint8_t array[sizeof(num)];
memcpy( array, &num, sizeof( num ) );

注意 字节顺序将取决于平台的字节序。如果您需要网络顺序(如示例中所示),请使用htons()函数:

uint16_t num = htons( std::stoi( hex, nullptr, 16 ) );

我找到了一种更好的方法,根据需要将数字转换为字符数组。此解决方案仅适用于无符号类型!

template <typename T> bool ToByteArray(T num, unsigned char* ret, size_t size) {
  if (ret == nullptr) {
      std::cout << "Error in: " << __func__ << ": nullptr" << std::endl;
      return false;
  }
  // drop the right-most bytes and convert to new right most byte.
  for (int i = 0; i < size; i++) {
      ret[i] = (int)((num >> (24 - 8*i)) & 0xFF);
  }
  return true;
}

这是更优雅的方式。

如果要将其转换回来 - 可以使用:

long FormatBlock(const unsigned char* arr, size_t size) {
  long num = 0;
  for (int i = 0; i < size; i++) {
      num += ((long)arr[i] << (24 - i*8));
  }
  return num;
}