ESP32平台下如何使sprintf生成的两个字符串内容一致?
ESP32 sprintf转十六进制字符串乱码问题解决方法
核心问题分析
你的乱码问题根源有两个:一是变量重复定义导致的内存冲突,二是循环条件和字符串数组长度设置错误引发的缓冲区溢出。
具体修正步骤
修正变量重复定义错误
把重复定义的char string1[32]改为char string2[32],避免两个变量占用同一块内存区域,引发数据覆盖。调整字符串数组长度
你的目标十六进制字符串有44个字符,加上C字符串必需的末尾\0终止符,每个字符串数组的长度至少要设为45,而不是32。32的长度远小于需求,会导致缓冲区溢出,写入内存垃圾数据,形成乱码前缀。修正循环条件
循环终止条件不能用sizeof(string1),而要基于原始字节数组的长度。比如你的bytesesp和bytesesp1是22字节(对应44个十六进制字符),循环应遍历0到21的索引,而不是字符串数组的大小。
修正后的代码示例
// 假设原始字节数组为22字节长度 uint8_t bytesesp[22] = {0x20, 0xd5, 0x6f, 0x5d, 0xae, 0x4e, 0xe2, 0x63, 0x8d, 0xb3, 0x7e, 0x4b, 0x25, 0xd7, 0x8b, 0xbb, 0xc4, 0x23, 0x38, 0xed, 0xee, 0x4e}; uint8_t bytesesp1[22] = {0x20, 0xd5, 0x6f, 0x5d, 0xae, 0x4e, 0xe2, 0x63, 0x8d, 0xb3, 0x7e, 0x4b, 0x25, 0xd7, 0x8b, 0xbb, 0xc4, 0x23, 0x38, 0xed, 0xee, 0x4e}; // 定义足够容纳结果的字符串数组,初始化全0避免残留垃圾 char string1[45] = {0}; char string2[45] = {0}; // 转换第一个字节数组 for (int i = 0; i < sizeof(bytesesp); i++) { sprintf(&string1[i*2], "%02x", bytesesp[i]); } // 转换第二个字节数组 for (int i = 0; i < sizeof(bytesesp1); i++) { sprintf(&string2[i*2], "%02x", bytesesp1[i]); }
额外注意点
- 字符串数组初始化全0:避免内存中残留的垃圾数据被当作字符串内容输出。
- 偏移地址正确:
&string1[i*2]确保每个字节对应的两个十六进制字符写入正确位置,不会覆盖之前的内容。 - 严格控制缓冲区大小:始终保证目标数组长度 ≥ 字节数×2 +1,彻底避免缓冲区溢出问题。
内容的提问来源于stack exchange,提问作者Geko66
相关产品推荐
相关产品推荐

