我有一个存储16个十六进制字符的字符串。 例如:
const char* arr = "DD2B23B62AC245DA";
我需要将这些字符写入一个8字节格式的二进制文件中。每个字节的十六进制值由两个十六进制字符表示。 我这样做的方式是:
unsigned char hexArr[8];
hexArr[0] = 0xDD;
hexArr[1] = 0x2B;
hexArr[2] = 0x23;
...
这样的问题是它是硬编码的,我需要能够将这个数组作为输入,然后填充hexArr
数组。
当我复制数组本身时,它将char D的十六进制值设置为十六进制值而不是D。 任何帮助我该怎么做?
答案 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);
}
}