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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:48:23