我有一块msgpack&d;数据创建如下:
#!/usr/bin/env python
from io import BytesIO
import msgpack
packer = msgpack.Packer()
buf = BytesIO()
buf.write(packer.pack("foo"))
buf.write(packer.pack("bar"))
buf.write(packer.pack("baz"))
稍后在我的应用程序(或其他应用程序)中,我需要解压缩前两个元素,但希望访问第三个元素STILL打包。到目前为止,我发现这样做的唯一方法是重新打包第三个元素,如下所示,效率相当低。
buf.seek(0)
unpacker = msgpack.Unpacker(buf)
item1 = unpacker.unpack()
item2 = unpacker.unpack()
item3 = unpacker.unpack()
packed_item3 = msgpack.pack(item3)
这可以让我到达我想要的地方,但我更愿意直接访问这最后一项,这样我就可以把它传递到需要去的地方。
答案 0 :(得分:0)
由于在执行msgpack后您的包不会是常量大小,因此您可以使用一组可识别的字节作为包的分隔符。 当你需要直接访问Nth pack时,仍然处于打包状态,你迭代你的字节数组,你的第N个包将位于第N-1个分隔符之后。 虽然这将具有O(n)复杂性,并且需要在整个bytearray上迭代,直到您需要的包。 带有“####”作为分隔符的字符串示例如下所示:
"pack1####pack2####pack3####pack4####pack5...."
答案 1 :(得分:0)
请参阅http://pythonhosted.org/msgpack-python/api.html#msgpack.Unpacker.skip
packed_item3 = None
def callback(b):
global packed_item3
packed_item3 = b
unpacker.skip(write_bytes=callback)
但不推荐使用write_bytes
选项。其他msgpack实现没有这样的API。
更常见的方式是双重包装。
buf.write(msgpack.packb(msgpack.packb(item3))
通过这种方式,您可以在不解包的情况下获得packed_item3
。
这种方式可以在其他msgpack实现中使用。
例如,流利者使用这种方式来实现高吞吐量。