我有一个存储16个十六进制字符的字符串。例如:
const char* arr = "DD2B23B62AC245DA";
我需要将这些字符写入8字节格式的二进制文件。每个字节的十六进制值由两个十六进制字符表示。我的做法是:
unsigned char hexArr[8];
hexArr[0] = 0xDD;
hexArr[1] = 0x2B;
hexArr[2] = 0x23;
...
这样做的问题是它是硬编码的,我需要能够获取这个数组作为输入,然后填充hexArr
数组。
当我复制数组本身时,它将字符D的十六进制值而不是D设置为十六进制值。有什么帮助吗?我怎么做?
虽然上面的答案是可以接受的,但我觉得这个更优雅:
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);
}
}
在我看来,最简单的方法是通过代码自己进行转换:
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