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

将字符数组转换为十六进制二进制格式C[重复]

卢出野
2023-03-14

我有一个存储16个十六进制字符的字符串。例如:

const char* arr = "DD2B23B62AC245DA";

我需要将这些字符写入8字节格式的二进制文件。每个字节的十六进制值由两个十六进制字符表示。我的做法是:

unsigned char  hexArr[8];
hexArr[0] = 0xDD;
hexArr[1] = 0x2B;
hexArr[2] = 0x23;
...

这样做的问题是它是硬编码的,我需要能够获取这个数组作为输入,然后填充hexArr数组。

当我复制数组本身时,它将字符D的十六进制值而不是D设置为十六进制值。有什么帮助吗?我怎么做?

共有2个答案

栾瑞
2023-03-14

虽然上面的答案是可以接受的,但我觉得这个更优雅:

int chartoint(char c) {
  const char* buf = "0123456789abcdef";
  const char* ptr = std::strchr(buf, std::tolower(c));

  if (!ptr)
    throw std::runtime_error("Not a hex digit:" + c);
  return ptr - buf;
}

void cast(const char* arr, std::vector<unsigned char>* chvec) {
  size_t arrlen = strlen(arr);
  if (arrlen & 1) {
    throw std::runtime_error(std::string("odd string length:") + arr);
  }

  while (*arr) {
    int val = chartoint(*arr++) << 4;
    val += chartoint(*arr++);
    chvec->push_back(val);
  }
}
时宾实
2023-03-14

在我看来,最简单的方法是通过代码自己进行转换:

std::vector<unsigned char> parseHex(const char *s) {
    std::vecotr<unsigned char> result;
    int acc=0, n=0;
    for (int i=0; s[i]; i++) {
        acc <<= 4;
        if (s[i] >= '0' && s[i] <= '9')      acc += (s[i] - '0');
        else if (s[i] >= 'a' && s[i] <= 'f') acc += 10 + (s[i] - 'a');
        else if (s[i] >= 'A' && s[i] <= 'F') acc += 10 + (s[i] - 'A');
        else throw std::runtime_error("invalid hex literal digit");
        if (++n == 2) {
            result.push_back(acc);
            acc = n = 0;
        }
    }
    if (n) throw std::runtime_error("invalid hex literal length");
    return result;
}
 类似资料:
  • 我有一个表示十六进制数的字符串: 我想将其转换为字符数组: 有什么方便的方法吗?如果有帮助,我可以使用c 11功能。 动机:我需要使用2字节字符数组保存一个整数(4字节)。我认为可以这样做的方法是使用std::hex将其转换为字符串,然后将字符串转换为char数组,但这是我无法继续的地方。。如果有另一种简单的方法——我想听听:) 重要提示:我可以假设十六进制数小于0xFFFF,并且是一个正数。

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

  • 问题内容: 我写了一些代码将十六进制显示字符串转换为十进制整数。但是,当输入类似100a或625b(带有字母的东西)时,我得到了这样的错误: java.lang.NumberFormatException:对于输入字符串:java.lang.Integer.parseInt(未知源)处的java.lang.NumberFormatException.forInputString(未知源)处为“ 1

  • 我正在写一个Rust程序,读取I2C总线并保存数据。当我读取I2C总线时,我会得到十六进制值,比如,,等等。 现在,我只能将其作为字符串处理并按原样保存。有没有办法把它解析成一个整数?它有内置的功能吗?

  • 我有一个十六进制值字符串,我需要将其输出到一个char数组,以便可以将其用作函数输入。 请注意,sha512(firststring)的输出将是 810dcbf236457fee732f100d261c101412e04fc08abd4cb6ddd4442a7cb690acfcae6eeec25e321d5cf5d63174a3b38b31c0143a5702f5f28a43f38b1074285