Python 3.5 - 将字节对象转换为 16 位十六进制字符串 (b'\x07\x89' -> '0x0789')

Python 3.5 - Convert bytes object to 16bit hex string (b'\x07\x89' -> '0x0789')

一些设备returns数据(十六进制字节)以

的形式
data = b'\x07\x89\x00\x00\x12\x34'

如何将其转换为以下形式?

['0x0789', '0x0000', '0x1234']

我已经尝试过 hexlify 的组合。我正在使用 Python 3.5.

从您的 bytes 对象中取出两个一组。将每组的第一个值乘以 16**2。添加这两个值。在结果上使用 hex 将其转换为字符串表示形式。

>>> [hex(data[i]*16**2 + data[i+1]) for i in range(0,len(data),2)]
['0x789', '0x0', '0x1234']

我假设您暂时不需要用无用的零填充字符串。

使用struct模块;它具有 unpack 功能,允许指定数据块大小(字节、2 字节、4 字节)和字节顺序。如果您拥有的是 big-endian 半字大小的数据块,那么正确的格式键是“>H”。

要一次解析所有数据,请在格式说明符中添加计数:例如,“>3H”代表您输入的数组。也可以动态写字段数

完整示例:

import struct
data = b'\x07\x89\x00\x00\x12\x34'
d = struct.unpack(">{}H".format(len(data) // 2), data) # extract fields
result = [hex(x) for x in d] # convert to strings

有两个步骤:

  1. 将输入字节串分块为 2 字节序列
  2. 将序列显示为十六进制文字。

你可以use array module from stdlib:

import sys
from array import array

a = array('H', data)
if sys.byteorder != 'big':
    a.byteswap() # use big-endian order
result = ['0x%04X' % i for i in a]
# -> ['0x0789', '0x0000', '0x1234']

效率高,especially if you need to read data from a file