在python中将bytearray转换为short int
Posted
技术标签:
【中文标题】在python中将bytearray转换为short int【英文标题】:Converting bytearray to short int in python 【发布时间】:2017-07-19 09:57:17 【问题描述】:我有一个长字节数组
barray=b'\x00\xfe\x4b\x00...
将其转换为 2 字节整数列表的最佳方法是什么?
【问题讨论】:
【参考方案1】:您可以为此使用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)
【讨论】:
【参考方案2】:使用struct 模块:
import struct
count = len(barray)/2
integers = struct.unpack('H'*count, barray)
根据字节顺序,您可能需要为解包格式添加 <
或 >
。根据签名/未签名,它是h
,或H
。
【讨论】:
【参考方案3】:注意,使用 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)
【讨论】:
【参考方案4】:如果内存效率是一个问题,您可以考虑使用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])
【讨论】:
以上是关于在python中将bytearray转换为short int的主要内容,如果未能解决你的问题,请参考以下文章