将极长的字节流分成较小的字节

时间:2019-03-02 19:32:09

标签: python byte

所以我需要将一个非常长的字节流(来自USB)解压缩为4个字节的值。

目前我可以使用它了,但是我觉得有更好的方法可以做到这一点。

目前我得到了:

l=[]
for i in range(int(len(mybytes)/4)):
    l.append(struct.unpack_from('>i',mybytes,i*4))

因此,这感觉非常耗费资源,而且我只用16k字节就可以了。

我也觉得这可能是在我真的不知道如何用词写出来进行搜索之前问过的

3 个答案:

答案 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]