【发布时间】:2019-01-12 07:26:21
【问题描述】:
我正在开展一个项目,我在该项目中识别二进制文件中所有唯一出现的固定大小块,然后保存并将结果保存到二进制文件中(它需要跨多种语言工作)。
我的方法如下:我读取文件的每个块,散列,并将唯一的散列和二进制代码存储到字典中。每次程序看到重复的散列时,它都会附加该位置以供以后重建。结果字典的示例如下所示:
dict = {'d59fce39b5d8d4b278acbf2f5be0353c': [b'\xc5\xd7\x14\x84', 0, 1, 4],
'bf937a85a0f950f431a4c9c1aeca8686': [b'\x08\xe7\x07\x8f', 2, 3, 5]}
然后,我使用 with open('out.data, 'wb') as f: 将文件保存到磁盘 (f.write(dict)),但出现以下错误:
TypeError: a bytes-like object is required, not 'dict'
我在这里找到的其他解决方案对我没有帮助。我尝试按照here 的建议将字典传递给 JSON 对象,但得到了:
new_dict = json.dumps(dict)
TypeError: Object of type 'bytes' is not JSON serializable
我正在处理任意字节,因此,编码似乎不是解决此问题的方法。
【问题讨论】:
-
像
b'\xc5\xd7\x14\x84这样的bytes字符串可以很容易地转换为十六进制,就像哈希值一样。但我很好奇,这些字节字符串和二进制文件中固定大小的块之间有什么联系?可能有一种更有效的方式来存储这些数据。您通常会为每个块找到多少个重复位置? -
顺便说一句,使用
dict作为变量名不是一个好主意,因为这会影响内置的dict类型。 -
FWIW:JSON 中的“字节数组”通常是 Base64 编码的。这是额外的编码是有效的,如果不是总是[足够]有效。
标签: python python-3.x dictionary