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
相关产品推荐
相关产品推荐

