c - C中的十六进制字符串到字节数组

标签 c string

是否有任何标准的 C 函数可以将十六进制字符串转换为字节数组
我不想编写自己的函数。

最佳答案

据我所知,没有标准的功能可以这样做,但通过以下方式很容易实现:

#include <stdio.h>

int main(int argc, char **argv) {
    const char hexstring[] = "DEadbeef10203040b00b1e50", *pos = hexstring;
    unsigned char val[12];

     /* WARNING: no sanitization or error-checking whatsoever */
    for (size_t count = 0; count < sizeof val/sizeof *val; count++) {
        sscanf(pos, "%2hhx", &val[count]);
        pos += 2;
    }

    printf("0x");
    for(size_t count = 0; count < sizeof val/sizeof *val; count++)
        printf("%02x", val[count]);
    printf("\n");

    return 0;
}

编辑

正如 Al 指出的那样,如果字符串中有奇数个十六进制数字,则必须确保以 0 开头作为前缀。例如,字符串 "f00f5" 将被上面的例子错误地评估为 {0xf0, 0x0f, 0x05},而不是正确的 {0x0f, 0x00, 0xf5}

稍微修改了示例以解决@MassimoCallegari 的评论

关于c - C中的十六进制字符串到字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3408706/

相关文章:

c++ - pcap_next 调用填充 pcap_pkthdr,其中 len 等于零

c - 如何使我的阶乘函数可重入?

r - 计算数据串中的某些化学 react

c - 为什么我的 "gets"函数不能真正得到一个字符串?

python - 从文件读取时类型错误 :a bytes-like object is required, 而不是 'str'

c - 如何从 i2c io 扩展器 linux 请求 GPIO 中断(失败并显示 -EINVAL)

c - 平台无关的 size_t c 中的格式说明符?

c - 如何用 ncurses 检测大写锁定?

ios - 使用 NSScanner 或 NSRange 作为 url 来查找 NSSet 对象

c - 为什么 strcat 连接两个字符串失败?