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

ESP32平台下如何使sprintf生成的两个字符串内容一致?

ESP32 sprintf转十六进制字符串乱码问题解决方法

核心问题分析

你的乱码问题根源有两个:一是变量重复定义导致的内存冲突,二是循环条件和字符串数组长度设置错误引发的缓冲区溢出。

具体修正步骤

  1. 修正变量重复定义错误
    把重复定义的char string1[32]改为char string2[32],避免两个变量占用同一块内存区域,引发数据覆盖。

  2. 调整字符串数组长度
    你的目标十六进制字符串有44个字符,加上C字符串必需的末尾\0终止符,每个字符串数组的长度至少要设为45,而不是32。32的长度远小于需求,会导致缓冲区溢出,写入内存垃圾数据,形成乱码前缀。

  3. 修正循环条件
    循环终止条件不能用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:25:06