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

