You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中将十六进制格式字符串转换为十六进制查找数组

十六进制字符串转字节数组解决方案

你之前的代码核心错误是把需求搞反了:你要存储的是0xab这个数值本身(占1字节),不是"0xab"这个字符串(占4字节+结束符),sprintf是用来生成字符串的,第一个参数要求传入字符指针,你直接传output[0](unsigned char类型值)本身就会触发段错误,就算改对指针也只能得到字符串,不是你要的字节数值。

实现思路

  • 十六进制字符串中每2个字符对应1个字节,优先校验输入字符串长度是否为偶数,避免单字符无法转换
  • 先把单个十六进制字符转为对应的4位数值:0-9转0~9,a-f/A-F转10~15
  • 高4位的数值左移4位后和低4位的数值做或运算,就能得到完整的1字节数值
  • 循环遍历所有字符对,逐个存入输出数组即可

可运行实现代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 单个十六进制字符转对应数值,兼容大小写
unsigned char hex_char_to_val(char c) {
    if (isdigit(c)) {
        return c - '0';
    }
    c = tolower(c);
    return 10 + (c - 'a');
}

int main() {
    // 输入的十六进制字符串
    char crc_input[300] = "abcd12344f";
    // 输出字节数组,长度为输入字符串长度的一半即可
    unsigned char buf[4096] = {0};
    int input_len = strlen(crc_input);
    int output_len = input_len / 2;

    // 循环转换每两个字符为1字节
    for (int i = 0; i < output_len; i++) {
        unsigned char high_val = hex_char_to_val(crc_input[2 * i]);
        unsigned char low_val = hex_char_to_val(crc_input[2 * i + 1]);
        buf[i] = (high_val << 4) | low_val;
    }

    // 打印验证转换结果
    for (int i = 0; i < output_len; i++) {
        printf("buf[%d] = 0x%02x\n", i, buf[i]);
    }
    return 0;
}

输出效果

运行上述代码会得到符合你预期的结果:

buf[0] = 0xab
buf[1] = 0xcd
buf[2] = 0x12
buf[3] = 0x34
buf[4] = 0x4f

内容的提问来源于stack exchange,提问作者Othmane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:54:07