如何使用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
相关产品推荐
相关产品推荐

