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

Python3中如何转换树莓派接收的智能电表字节流为十六进制字符串?

Python3下将智能电表字节流转换为十六进制字符串的解决方案

问题说明

在树莓派上通过USB红外传感器从智能电表接收的字节流为bytes类型(示例字节流:CHAR = b'\x00\x86\x1b\x1b\x1b\x1b\x01\x01\x01\x01v\x05\x18\xe0\x99:b\x00b\x00rc\x01\x01v\x01\x01\x05\x08J\xdd\xbe\x0b\n\x01ISK\x00\x044\xb9Zrb\x01e\x08J\xe1\xf4b\x01c\x15\xb9\x00v\x05\x18\xe0\x99;b\x00b\x00rc\x07\x01w\x01\x0b\n\x01ISK\x00\x044\xb9Z\x07\x01\x00b\n\xff\xffrb\x01e\x08J\xe1\xf4t')。

Python2中使用以下代码可正常转换为十六进制字符串:

data = ''
char = port.read()
data = data + char.encode('HEX')

但在Python3中执行会报错:

Traceback (most recent call last):
  File "/home/pi/temperatur/Smartmeter.py", line 72, in <module>
data = data + char.encode('HEX') # Original in Python 2
AttributeError: 'bytes' object has no attribute 'encode'

原因是Python3中bytes对象不再支持encode('HEX')方法,需改用新的实现方式。

可行解决方案

方法1:使用bytes.hex()方法(推荐)

Python3的bytes对象内置了hex()方法,直接调用即可返回小写的十六进制字符串,完全满足需求:

data = ''
char = port.read()
data += char.hex()

如果需要大写的十六进制字符串,可追加.upper():

data += char.hex().upper()

方法2:使用binascii模块

通过binascii.hexlify()函数将bytes转换为十六进制格式的bytes,再解码为字符串:

import binascii

data = ''
char = port.read()
data += binascii.hexlify(char).decode('utf-8')

验证示例

用给定的示例字节流测试:

CHAR = b'\x00\x86\x1b\x1b\x1b\x1b\x01\x01\x01\x01v\x05\x18\xe0\x99:b\x00b\x00rc\x01\x01v\x01\x01\x05\x08J\xdd\xbe\x0b\n\x01ISK\x00\x044\xb9Zrb\x01e\x08J\xe1\xf4b\x01c\x15\xb9\x00v\x05\x18\xe0\x99;b\x00b\x00rc\x07\x01w\x01\x0b\n\x01ISK\x00\x044\xb9Z\x07\x01\x00b\n\xff\xffrb\x01e\x08J\xe1\xf4t'
print(CHAR.hex())

输出结果开头为00861b1b1b1b01010101760518e0993a620062007263010176010105084addbe0b0a0149534b000434b95a72620165084ae1f462016315b900760518e0993b620062007263070177010b0a0149534b000434b95a070100620affff72620165084ae1f474,与需求格式一致,可按需手动或程序换行。

内容的提问来源于stack exchange,提问作者Hubert Humberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:21:15