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

时间:2017-11-09 14:46:04

标签: c++ arrays string c++11

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

std::string hex = "3371";

我想将它转换为char数组:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

只需使用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 ) );

答案 1 :(得分:-2)

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

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;
}