将char数组转换为十六进制二进制格式C ++

时间:2014-03-27 06:37:57

标签: c++

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

const char* arr = "DD2B23B62AC245DA";

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

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

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

当我复制数组本身时,它将char D的十六进制值设置为十六进制值而不是D。 任何帮助我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

虽然上面的答案被接受,但我认为这个更优雅:

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