我有一些字节数据想要被解析为流,因为序列中较早的字节控制下游字节的解释。所以 BytesIO 看起来像我想要的东西。但我也想使用 struct 模块提供的设施。但是 struct 的接口不是流式传输的。有没有一种聪明/惯用的方式将两者结合起来?
例如,这是一个示例数据块:
b'\n\x00\x02\x90\x10\x00\n\x00\x02`\x10\x00\n\x00\x02\x80\x10\x00'
我想将前 4 个字节提取为无符号大端整数(例如struct.unpack(fmt='>I'
)。因为下一个字节是 0x10,我知道应该还有一个字节,结果是 0x00。然后重新开始,读取下一个 4 (0x0A000290),清洗,冲洗,重复。每个 4 字节 id 之后的字节会触发各种下游读取(一些字节,一些短路)。
我可以做类似的事情
stream = b'\n\x00\x02\x90\x10\x00\n\x00\x02`\x10\x00\n\x00\x02\x80\x10\x00'
while stream:
id = struct.unpack('>I', stream[:4])
stream = stream[4:]
...
但这似乎不够优雅。