gpt4 book ai didi

将十六进制字符串转换为字节字符串

转载 作者:太空狗 更新时间:2023-10-29 17:19:53 27 4
gpt4 key购买 nike

当从十六进制表示形式解码时,我需要将一个(可能很长的)字符串如 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);
}

有两件事让我觉得很丑陋:

  1. 我每次插入缓冲区时除以二的方式
  2. 计算十六进制数字的十进制值的条件逻辑

有没有更好的方法?最好不要使用我必须添加依赖项的东西(因为我想以最少的跨平台问题发布此代码)。我的按位数学很糟糕 ;)

注意:数据已经预先验证为全部小写并且是正确的十六进制对字符串。

最佳答案

/* allocate the buffer */
char * buffer = malloc((strlen(s) / 2) + 1);

char *h = s; /* this will walk through the hex string */
char *b = buffer; /* point inside the buffer */

/* offset into this string is the numeric value */
char xlate[] = "0123456789abcdef";

for ( ; *h; h += 2, ++b) /* go by twos through the hex string */
*b = ((strchr(xlate, *h) - xlate) * 16) /* multiply leading digit by 16 */
+ ((strchr(xlate, *(h+1)) - xlate));

编辑添加

在 80x86 汇编语言中,strchr() 的核心基本上是一条指令——它不循环。

另外:这不会进行边界检查,不适用于 Unicode 控制台输入,并且如果传递无效字符会崩溃。

另外:感谢那些指出了一些严重拼写错误的人。

关于将十六进制字符串转换为字节字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12535320/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com