簡體   English   中英

在python中將bytearray轉換為short int

[英]Converting bytearray to short int in python

我有一個很長的bytearray

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

將它轉換為2字節整數列表的最佳方法是什么?

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

使用struct模塊:

import struct

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

根據字節順序,您可能希望為解包格式添加<> 根據簽名/未簽名,它是hH

如果考慮內存效率,可以考慮使用array.array

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

這就好比一個節省空間的基本數組,用面向對象的封裝器,所以它支持序列類型的方法你將有一個對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])

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM