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

如何将字符串中的十六进制值转换为实际字节、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 10:45:07