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

如何使用sprintf将uint8_t数组转换为十六进制字符串输出?

错误原因
  • 错误使用%s格式化符:%s仅适用于以\0结尾的合法C字符串,你传入的是二进制uint8_t数组,其中的值大部分不属于可打印ASCII范围,且没有字符串结束标记,因此会输出乱码、输出长度也不可控。
  • 你的需求是将每个二进制字节转换为2位大写十六进制字符,%s没有自动转十六进制的能力,必须手动遍历每个字节做格式转换。
修复方案

你可以先拼接命令前缀,再循环处理每个二进制字节转十六进制,最后拼接模式参数和结束符即可,示例代码如下:

void send_bin(uint8_t* binarypayload, uint8_t size, uint32_t mode)
{
    char buffer[256];
    int offset = 0;
    // 拼接AT指令前缀
    offset += sprintf(buffer + offset, "AT+ZF=");
    // 逐个字节转2位大写十六进制
    for(int i = 0; i < size; i++){
        offset += sprintf(buffer + offset, "%02X", binarypayload[i]);
    }
    // 拼接模式参数和结束符
    offset += sprintf(buffer + offset, ",%lu\r\n", mode);
    // 直接用offset取实际长度,比strlen效率更高
    HAL_UART_Transmit(&husart1, (uint8_t*)buffer, offset, 1000);
}

补充说明:%02X表示将数值转为2位大写十六进制,不足2位时自动补前导0,刚好匹配你需要的输出格式;如果需要小写十六进制,把%02X换成%02x即可。如果担心缓冲区溢出,可以将sprintf替换为snprintf,每次传入剩余缓冲区长度做越界校验。

内容的提问来源于stack exchange,提问作者Clément

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:18:03