MicroPython中bytes对象无法使用带分隔符hex()方法的解决方案
问题说明
MicroPython 对内置bytes类型的hex()方法做了功能裁剪,仅支持无参数调用返回连续无分隔的十六进制字符串,不兼容 CPython 3.9 及以上版本支持的传入分隔符参数的用法,直接执行data_raw.hex('-')会抛出参数错误。
高兼容性变通实现
优先选择基于内置hex()方法+字符串拼接的方案,性能远高于纯Python逐字节转码的实现,输出效果和CPython原生逻辑完全一致:
def hex_with_sep(data: bytes, sep: str = '-') -> str: raw_hex = data.hex() return sep.join(raw_hex[i:i+2] for i in range(0, len(raw_hex), 2))
调用时直接替换原有逻辑即可:
# 替换原来的 str(data_raw.hex('-')) formatted_hex = hex_with_sep(data_raw, '-')
以输入b'\x01\xa2\xff\x0d'为例,输出结果为01-a2-ff-0d,和原脚本输出完全匹配。
可选优化方案
如果希望完全保留原有bytes.hex()的调用习惯,可以在脚本初始化阶段给bytes类型打补丁,注意该方法仅在内存充足的MicroPython端口(如ESP32、RP2040全功能固件)上使用:
# 初始化阶段执行一次即可 _original_bytes_hex = bytes.hex def _patched_hex(self, sep=''): if sep == '': return _original_bytes_hex(self) raw = _original_bytes_hex(self) return sep.join(raw[i:i+2] for i in range(0, len(raw), 2)) bytes.hex = _patched_hex
补丁执行完成后,原有代码data_raw.hex('-')无需任何修改即可正常运行。
实现注意事项
- 禁止使用字符串逐次累加的方式拼接结果,MicroPython中字符串为不可变对象,逐次累加会产生大量临时内存碎片,串口数据量较大时极易触发内存溢出,
str.join()是当前运行时内存效率最高的字符串拼接方式。 - 不要尝试用纯Python实现逐字节转十六进制逻辑,内置的
bytes.hex()为C层实现,转换效率比纯Python手写逻辑高10倍以上,优先调用内置方法完成基础转换再做分隔处理。 - 若运行在资源极度紧张的硬件(如ESP8266精简固件)上,不要使用猴子补丁方案,直接调用独立转换函数即可,减少常驻内存占用。
内容的提问来源于stack exchange,提问作者NicoCaldo
相关产品推荐
相关产品推荐

