如何将字符串中的十六进制值转换为实际字节、uint8_t数组或uint32
问题根因
你代码出错的核心原因是sscanf的%X格式符预期接收的是unsigned int*类型的指针,在32位系统下unsigned int占4字节,你传入仅1字节宽度的uint8_t*指针时,sscanf写入数据会触发内存越界,覆盖栈上其他区域数据,因此会得到异常值,严重时会直接导致程序崩溃。
正如@Clifford 提到的,该场景下
sscanf默认会按int类型宽度写入数据,传入uint8_t类型指针必然会触发内存越界问题。
修复方案
方案1:转换为uint8_t数组
使用C99标准支持的长度修饰符hh,%hhX可以明确告诉sscanf按1字节无符号数解析十六进制值,示例代码如下:
#include <stdint.h> #include <stdio.h> int main() { uint8_t ns[4]; // %hhX明确指定写入目标为1字节宽度的无符号变量 int parse_cnt = sscanf("FAFBFCFD", "%hhX%hhX%hhX%hhX", &ns[0], &ns[1], &ns[2], &ns[3]); if (parse_cnt == 4) { // 此时ns数组的取值依次为0xFA、0xFB、0xFC、0xFD } return 0; }
如果需要兼容不支持C99标准的老旧编译器,可以先解析到临时变量再截断:
uint8_t ns[4]; uint32_t tmp; for (int i = 0; i < 4; i++) { // %2X表示每次仅读取2个十六进制字符,避免多读 sscanf("FAFBFCFD" + i * 2, "%2X", &tmp); ns[i] = (uint8_t)tmp; }
方案2:直接转换为uint32_t类型
如果要把整个8位十六进制字符串转换为单个32位无符号整数,直接按%X格式解析到uint32_t类型变量即可:
uint32_t value; int parse_cnt = sscanf("FAFBFCFD", "%X", &value); // 解析成功后value取值为0xFAFBFCFD,可根据大小端需求自行调整字节序
内容的提问来源于stack exchange,提问作者Daniel Marbán
相关产品推荐
相关产品推荐

