C语言中如何将十进制数字字符串转为指定格式的十六进制数组
解决十进制转十六进制字节拆分问题
最佳解决方案:直接位运算拆分字节
无需通过字符串中转,直接对转换后的整数进行位操作,高效且不易出错:
// 1. 将输入字符串转为整数 long val = strtol(str_input, NULL, 10); // 2. 拆分高、低字节 output[2] = (uint8_t)((val >> 8) & 0xFF); // 高8位,对应4000的0x0F output[3] = (uint8_t)(val & 0xFF); // 低8位,对应4000的0xA0 // 验证输出 printf("0x%02x 0x%02x\n", output[2], output[3]);
原理说明
输入范围0-8916对应的十六进制是0x0000到0x22D4,均为16位以内的数值:
val >> 8:将数值右移8位,等效于除以256,提取高8位& 0xFF:确保结果被限制在uint8_t的0-255范围内val & 0xFF:直接提取低8位数值
修复原有字符串转换代码
如果坚持使用字符串中转,需先将十六进制字符串格式化为4位带前导零的形式,再按两位拆分:
char ui8_hex[5]; // 需容纳4个字符+终止符 int val = (int)strtol(str_input, (char **)NULL, 10); // 用%04x生成4位十六进制字符串,不足补前导零 sprintf(ui8_hex, "%04x", val); // 分别截取前两位和后两位 sscanf(&ui8_hex[0], "%2hhx", &output[2]); sscanf(&ui8_hex[2], "%2hhx", &output[3]); printf("0x%02x 0x%02x\n", output[2], output[3]);
原有代码的问题
原代码用%x格式化4000时得到3位字符串"fa0",循环读取时:
- 第一次取
&ui8_hex[0]即"fa0",%2hhx会读取前两位"fa"得到0xfa - 第二次取
&ui8_hex[1]即"a0",得到0xa0
这种按字符串位截取的逻辑,和你需要的高/低字节拆分逻辑完全不符。
内容的提问来源于stack exchange,提问作者Brook
相关产品推荐
相关产品推荐

