当前位置: 首页 > 知识库问答 >
问题:

将十六进制字符串转换为字符数组c[重复]

闻人嘉木
2023-03-14

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

std::string hex = "3371";

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

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

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

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

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

共有2个答案

车子平
2023-03-14

我发现了一个更好的方法来转换一个数字到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;
}
孟承嗣
2023-03-14

只需使用std::stoi():

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

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

uint16_t num = htons( std::stoi( hex, nullptr, 16 ) );
 类似资料:
  • 我有一个十六进制值字符串,我需要将其输出到一个char数组,以便可以将其用作函数输入。 请注意,sha512(firststring)的输出将是 810dcbf236457fee732f100d261c101412e04fc08abd4cb6ddd4442a7cb690acfcae6eeec25e321d5cf5d63174a3b38b31c0143a5702f5f28a43f38b1074285

  • 将可变长度十六进制字符串(例如,转换为包含该数据的字节数组的最佳方式是什么。 即转换: 进入这个 还是这个 因此,当我将此写入一个文件并将其写入hexresp-C时,我将得到包含的二进制数据。

  • 我有一个像“示例”这样的字符串。我想得到十六进制格式的字符串;像这样: 请给出C#语法。

  • 问题内容: 要将String转换为十六进制,我正在使用: 在此处投票最高的答案中对此进行了概述:在Java中将 字符串转换为十六进制 我该如何反向执行,即将十六进制转换为字符串? 问题答案: 您可以从转换后的字符串中进行重构,这是一种实现方法: 另一种方法是使用,从包: 单元测试以验证: 注:领先剥离的仅仅是必要的,因为的你的填充方法。如果您不介意将其替换为简单的,则可以将此行放在:

  • 问题内容: 我想将十六进制字符串转换为二进制字符串。例如,十六进制2是0010。下面是代码: 但是,这仅适用于十六进制0-9;它不适用于十六进制A-F,因为它使用。谁能增强它? 问题答案: 您需要告诉Java int是十六进制的,如下所示: