我需要将类似于 char * s = "2f0a3f"
的字符串转换为其代表的实际字节,当从十六进制表示解码时。目前我正在使用以下方法,但感觉很笨拙而且不正确。
size_t hexlength = strlen(s);
size_t binlength = hexlength / 2;
unsigned char * buffer = malloc(binlength);
long i = 0;
char a, b;
for (; i < hexlength; i += 2) {
a = s[i + 0]; b = s[i + 1];
buffer[i / 2] =
((a < '9' ? a - '0' : a - 'a' + 10) << 4) + (b < '9' ? b - '0' : b - 'a' + 10);
}
这里有两件事让我感到不太好:
- 每次将数据推入缓冲区时,我都要除以二
- 找出十六进制数字的小数值时需要条件逻辑判断
是否有更好的解决方法?最好不要使用需要添加依赖项的东西(因为我想尽量减少跨平台问题)。我的位运算很糟糕 ;)
注意:数据已预先验证为全小写且为正确的十六进制对字符串。
digittoint
。您可能希望将该逻辑拆分为具有该名称的宏或内联函数。 - ecatmur