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

