所以我需要将一个非常长的字节流(来自USB)解压缩为4个字节的值。
目前我可以使用它了,但是我觉得有更好的方法可以做到这一点。
目前我得到了:
l=[]
for i in range(int(len(mybytes)/4)):
l.append(struct.unpack_from('>i',mybytes,i*4))
因此,这感觉非常耗费资源,而且我只用16k字节就可以了。
我也觉得这可能是在我真的不知道如何用词写出来进行搜索之前问过的
答案 0 :(得分:2)
您还可以尝试使用能够直接从二进制数据加载的数组模块:
import array
arr = array.array("I",mybytes) # "I" stands for unsigned integer
arr.byteswap() # only if you're reading endian coding different from your platform
l = list(arr)
答案 1 :(得分:2)
您可以指定要解压缩的整数的大小(Python 3.6 +):
>>> import struct
>>> mybytes = bytes([1,2,3,4,5,6,7,8])
>>> struct.unpack(f'>2i',mybytes)
(16909060, 84281096)
>>> n = len(mybytes) // 4
>>> struct.unpack(f'>{n}i',mybytes) # Python 3.6+ f-strings
(16909060, 84281096)
>>> struct.unpack('>{}i'.format(n),mybytes) # Older Pythons
(16909060, 84281096)
>>> [hex(i) for i in _]
['0x1020304', '0x5060708']
答案 2 :(得分:1)
将其包装在BytesIO
对象中,然后使用iter
调用其read
方法,直到它返回空的bytes
值。
>>> import io, struct
>>> bio = io.BytesIO(b'abcdefgh')
>>> int_fmt = struct.Struct(">i")
>>> list(map(int_fmt.unpack, iter(lambda: bio.read(4), b'')))
[(1633837924,), (1701209960,)]
您可以对其进行调整,以从每个元组中提取单个int
值,或切换到from_bytes
类方法。
>>> bio = io.BytesIO(b'abcdefgh')
>>> list(map(lambda i: int.from_bytes(i, 'big'), iter(lambda: bio.read(4), b'')))
[1633837924, 1701209960]