在python中将bytearray转换为short int

时间:2017-07-19 09:57:18

标签: python arrays short

我有一个很长的bytearray

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

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

4 个答案:

答案 0 :(得分:5)

您可以使用struct包:

from struct import unpack

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

这将产生签名的短裤。对于未签名的,请改为使用'H'

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

这会在 little-endian 机器上生成样本输入:

>>> 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)

答案 1 :(得分:4)

使用struct模块:

import struct

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

根据字节顺序,您可能需要为解包格式添加<>。取决于签名/未签名,hH

答案 2 :(得分:1)

如果需要关注内存效率,可以考虑使用array.array

>>> barr = b'\x00\xfe\x4b\x00'
>>> import array
>>> short_array = array.array('h', barr)
>>> short_array
array('h', [-512, 75])

这就像一个节省空间的原始数组,带有OO包装器,因此它支持list上的序列类型方法,如.append.pop,和切片!

>>> short_array[:1]
array('h', [-512])
>>> short_array[::-1]
array('h', [75, -512])

此外,恢复bytes对象变得微不足道:

>>> short_array
array('h', [-512, 75])
>>> short_array.tobytes()
b'\x00\xfeK\x00'

注意,如果您希望使用原生字节顺序的相反字节序,请使用就地byteswap方法:

>>> short_array.byteswap()
>>> short_array
array('h', [254, 19200])

答案 3 :(得分:1)

注意,使用Python struct库转换数组还允许您为格式说明符中的每个项指定重复计数。因此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)