什么char可用于在python 2.7字符串中分隔二进制数据?

时间:2016-01-01 01:34:20

标签: python ascii pack

我有一个包含二进制数据条目的列表,每个条目都有一个任意长度。我想将这一切存储在一个大的二进制字符串中。考虑到这些数据可能包含任何字符序列,我可能会选择将列表中的每个条目分开,如何将此列表打包成仍包含不同条目的字符串?

4 个答案:

答案 0 :(得分:3)

pickle协议应该这样做。 dump写入文件,dumps写入字符串。

mylist = [list of large integers]
pickle.dump(mylist, open('somefile', 'wb'), protocol=2)

答案 1 :(得分:2)

出于您所说的原因,您不能使用单个字符来分隔它们。您可以指定一个特殊的分隔符,因此0x0。然后,您还需要一种方法来转义数据中出现的任何0x0。但是,您还需要在显示的任何位置转义转义字符。

答案 2 :(得分:2)

与使用分隔符相比,您可能最好为要遵循的对象长度写入字节数。

如果纯粹的空间效率并不重要,那么另一种可行的方法就是使用pickle代替。还有一个选项是对字节进行base64编码,然后在base64字符集之外使用分隔符。

答案 3 :(得分:0)

不确定为什么需要输出为二进制,所以这可能不适合你。但是,您可以使用zlib将数据写入单个字符串:

>>> import zlib
>>> l=[bin(i) for i in range(10)]
>>> zlib.compress(str(l))
'x\x9c\x8bV7H2P\xd7Q\x00R\x86P\n\xc6\x85\xf3a\x02\x060\x11\x84\x12\x84\x1a\xb8"\xa0\xaaX\x00\xe9\x95\x11\x14'

然后你可以轻松解压缩:

>>> zlib.decompress(zlib.compress(str(l)))
"['0b0', '0b1', '0b10', '0b11', '0b100', '0b101', '0b110', '0b111', '0b1000', '0b1001']"

要从那里将其重新转换为列表,您可以使用eval:

>>> new_l=eval(zlib.decompress(zlib.compress(str(l))))
>>> new_l
['0b0', '0b1', '0b10', '0b11', '0b100', '0b101', '0b110', '0b111', '0b1000', '0b1001']