2017-07-19 81 views

回答

2

使用struct模塊:

import struct 

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

根據不同的字節順序可能要在前面加上一個<>的拆包格式。取決於簽名/未簽名,它是hH

+0

這樣做,非常感謝! – Sparks

0

可以使用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 
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) 
0

如果內存效率是一個問題,你可以考慮使用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]) 
0

請注意,使用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)