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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:52:53