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

C语言程序如何从十六进制字符串中提取单个十六进制数值

十六进制字符串提取单字节数值实现方案

核心逻辑

  • 你给出的输入是ASCII字符组成的十六进制串,每2个连续字符对应1个字节的十六进制数值,遍历字符串时步长设为2即可拆分出所有待转换的字符对
  • 单个十六进制字符转数值规则:0-9直接减'0'得到对应数值,A-F(兼容小写的话先统一转大写)减'A'再加10得到对应数值
  • 双字符拼接为字节:高位字符的数值左移4位,和低位字符的数值做按位或运算,即可得到最终的单字节数值

C语言示例代码

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

// 单个十六进制字符转对应数值
unsigned char hex_char_to_val(char c) {
    c = toupper(c);
    if (c >= '0' && c <= '9') return c - '0';
    if (c >= 'A' && c <= 'F') return c - 'A' + 10;
    // 非法字符可根据需求自定义处理逻辑,这里默认返回0
    return 0;
}

int main(void) {
    char str[] = "40004A0060007A0034006600";
    int str_len = strlen(str);
    // 字节数量是字符串长度的1/2
    unsigned char byte_buf[str_len / 2];
    int byte_cnt = 0;

    // 步长为2遍历字符串
    for (int i = 0; i < str_len; i += 2) {
        unsigned char high_val = hex_char_to_val(str[i]);
        unsigned char low_val = hex_char_to_val(str[i + 1]);
        byte_buf[byte_cnt++] = (high_val << 4) | low_val;
    }

    // 打印验证结果
    for (int i = 0; i < byte_cnt; i++) {
        printf("0x%02X ", byte_buf[i]);
    }
    return 0;
}

运行输出

0x40 0x00 0x4A 0x00 0x60 0x00 0x7A 0x00 0x34 0x00 0x66 0x00

注意事项

  • 输入字符串长度必须为偶数,如果存在奇数长度的输入场景,需要提前做合法性校验,避免数组越界访问
  • 如果输入的十六进制串带有0x前缀、空格或其他分隔符,需要先做字符串清洗,过滤掉非十六进制字符后再执行转换逻辑
  • 非法十六进制字符的处理可根据业务需求调整,比如增加报错提示、跳过非法字符等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:06:06