在python中将bytearray转换为短int

2024-04-24 18:38:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很长的告别日

barray=b'\x00\xfe\x4b\x00...

将其转换为2字节整数列表的最佳方法是什么?


Tags: 方法列表字节整数x00x4bxfebarray
3条回答

您可以使用struct包来实现:

from struct import unpack

tuple_of_shorts = unpack('h'*(len(barray)//2),barray)

这将产生符号短路。对于未签名的,请使用'H'

tuple_of_shorts = unpack('H'*(len(barray)//2),barray)

这在小端机器上为您的样本输入生成:

>>> struct.unpack('h'*(len(barray)//2),barray)
(-512, 75)
>>> struct.unpack('H'*(len(barray)//2),barray)
(65024, 75)

如果您想使用big endian或little endian,可以在规范中添加>(big endian)或<(little endian)。例如:

# Big endian
tuple_of_shorts = unpack('>'+'H'*(len(barray)//2),barray)  # unsigned
tuple_of_shorts = unpack('>'+'h'*(len(barray)//2),barray)  # signed

# Little endian
tuple_of_shorts = unpack('<'+'H'*(len(barray)//2),barray)  # unsigned
tuple_of_shorts = unpack('<'+'h'*(len(barray)//2),barray)  # signed

正在生成:

>>> unpack('>'+'H'*(len(barray)//2),barray)  # big endian, unsigned
(254, 19200)
>>> unpack('>'+'h'*(len(barray)//2),barray)  # big endian, signed
(254, 19200)
>>> unpack('<'+'H'*(len(barray)//2),barray)  # little endian, unsigned
(65024, 75)
>>> unpack('<'+'h'*(len(barray)//2),barray)  # little endian, signed
(-512, 75)

使用struct模块:

import struct

count = len(barray)/2
integers = struct.unpack('H'*count, barray)

根据endianness,您可能需要为解包格式预先准备一个<>。根据有符号/无符号,它是h,或者H

注意,使用Python^{}库转换数组还允许您为格式说明符中的每个项指定重复计数。例如4H与使用HHHH相同。

使用这种方法可以避免创建潜在的大量格式字符串:

import struct

barray = b'\x00\xfe\x4b\x00\x4b\x00'
integers = struct.unpack('{}H'.format(len(barray)/2), barray)

print(integers)

给你:

(65024, 75, 75)

相关问题 更多 >