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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:57:21