【问题标题】:append new msgpack data to end of file将新的 msgpack 数据附加到文件末尾
【发布时间】:2015-04-09 16:43:19
【问题描述】:

不先解码就将对象附加到msgpack数据中是否有效?

即类似的东西:

  • 编码数据1
  • 打包数据1
  • 将打包数据1写入文件

那么,

  • 打包数据2
  • 将打包数据 2 附加到文件末尾

或者应该是:

  • 读取文件
  • msgunpack 文件 -> data1
  • 创建data1_2(包括data1、data2)
  • 打包数据1_2
  • 将打包的 data1_2 写入文件

【问题讨论】:

  • 我也有同样的问题,但是对于 python。

标签: msgpack


【解决方案1】:

您可以只追加到文件中。查看How to unpack a msgpack file? 获取我阅读文章的示例代码,你会看到我也在附加,这很有效。

【讨论】:

  • 那么如果你有一个用msgpack编码的数组,你可以通过在文件末尾添加新的msgpack数据来扩展它吗?
【解决方案2】:

扩展亚历克斯的回答,因为spec 仍然没有阐明这一点,我不知道如何将该范式转换为其他库。我不确定这是否是官方规范的一部分,但这是最不令人惊讶的实现方式,而且很直观。如果您想要仅附加的数据格式,这将非常有用。

您应该能够简单地连接任何打包的 msgpack 对象。你的库应该提供某种Unpacker 类,它接受一个包含一个或多个连接的 msgpack 对象的字节流,并发出一个解压结构流。如果您的库缺少此功能,您可能必须自己实现它。

这是 python 的 msgpack 包中的样子:

from io import BytesIO
import msgpack as mp

buf = BytesIO()
buf.write(packer.pack(1))
buf.write(packer.pack(2))
buf.write(packer.pack('foo'))
buf.write(packer.pack(True))
buf.write(packer.pack({"spam":"eggs"}))

print('file contents: {}'.format(buf.getvalue()))
buf.seek(0)

unpacker = mp.Unpacker(buf)
for i, obj in enumerate(unpacker):
    print('{}: {} {}'.format(i, repr(obj), type(obj)))

输出:

file contents: b'\x01\x02\xa3foo\xc3\x81\xa4spam\xa4eggs'
0: 1 <class 'int'>
1: 2 <class 'int'>
2: 'foo' <class 'str'>
3: True <class 'bool'>
4: {'spam': 'eggs'} <class 'dict'>

如果你想实现你自己的,python 后备Unpacker 非常易读。

【讨论】:

    猜你喜欢
    • 2017-06-15
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多