Python3中替代Python2 hex编码/解码方法求助
解决Python3中
x.encode('hex')/x.decode('hex')的兼容问题 核心问题说明
Python2里str和字节序列不做区分,x.encode('hex')可以直接把字节串转成十六进制字符串;但Python3严格区分str和bytes,这个方法被移除了,得用binascii模块的工具替代,同时要注意两者的类型转换。
针对你代码的修改方案
你的data是socket.recv()返回的bytes对象,对应Python2里的字节串,直接修改两处用到encode('hex')的地方:
1. 解析intype部分
原代码:
intype = int(data.encode("hex")[2:4])
修改后:
import binascii # 把bytes转成十六进制字符串,再截取子串转成整数 hex_data = binascii.hexlify(data).decode('ascii') intype = int(hex_data[2:4], 16)
2. 计算packetLength部分
原代码:
packetLength = (int(str(data[4]).encode("hex"), 16) / 16 + 1)
注意:Python3中取bytes的单个元素(data[4])返回的是整数(0-255),得先转回单字节的bytes再处理:
修改后:
# 把单个整数字节转回bytes,再转十六进制字符串 single_byte_hex = binascii.hexlify(bytes([data[4]])).decode('ascii') packetLength = (int(single_byte_hex, 16) / 16 + 1)
你的尝试报错原因
bytes.fromhex():这个方法是把十六进制字符串转回bytes,和你需要的“bytes转十六进制字符串”方向完全相反,传入原始bytes自然会报非十六进制字符的错误。binascii.b2a():没有这个方法,正确的应该是binascii.b2a_hex()(和hexlify功能完全一样),如果方法名写错或者传入了str类型,就会触发“需要bytes-like对象”的错误。
完整修改后的代码
import binascii INPUT_STATUS = 20 INPUT_READ_DATA = 21 EXTENSION_8BYTES = 32 #(...) data = self.receivesocket.recv(25) hex_data = binascii.hexlify(data).decode('ascii') intype = int(hex_data[2:4], 16) if intype == INPUT_STATUS: self.setReportingType() elif intype == INPUT_READ_DATA: if self.calibrationRequested: single_byte_hex = binascii.hexlify(bytes([data[4]])).decode('ascii') packetLength = (int(single_byte_hex, 16) / 16 + 1) self.parseCalibrationResponse(data[7:(7 + packetLength)]) if packetLength < 16: self.calibrationRequested = False elif intype == EXTENSION_8BYTES: self.processor.mass(self.createBoardEvent(data[2:12])) else: print("ACK to data write received")
内容的提问来源于stack exchange,提问作者Efe Turan
相关产品推荐
相关产品推荐

