【问题标题】:Divide an extremely long byte stream into smaller bytes将极长的字节流分成更小的字节
【发布时间】:2019-03-04 02:11:25
【问题描述】:

所以我需要将一个极长的字节流(来自 USB)解压成 4 个字节的值。

目前我得到了它的工作,但我觉得有更好的方法来做到这一点。

目前我得到了:

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

所以这感觉资源非常昂贵,而且我这样做了很多 16k 字节。

我也觉得这个问题可能在我真的不知道如何用词来搜索之前就被问到了

【问题讨论】:

标签: python byte


【解决方案1】:

你也可以试试数组模块,它可以直接从二进制数据中加载:

 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)

【讨论】:

  • 谢谢,试试看
【解决方案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']

【讨论】:

  • 谢谢,试试看
【解决方案3】:

将其包装在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]

【讨论】:

  • 谢谢,试试看
猜你喜欢
  • 2019-06-02
  • 2019-07-19
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多