我需要将二进制数据嵌入到 XML 文件中,因此我选择为此使用 base85 编码。
我有一个大字节数组,里面充满了对struct.pack()
via的调用的输出bytearray.extend(struct.pack(varying_data))
。然后它被压缩zlib
并用base64.b85encode()
.
这一直有效,但是在单个输入文件上,出现以下奇怪的错误:
ValueError: base85 overflow in hunk starting at byte 582200`
然后我修改了 base64.py 以打印出当前块的值以及它包含的字节。输入块是b'||a|3'
,它的值是4.331.076.573,大于256^4 = 4.294.967.296,因此不能用四个字节表示(这就是错误的来源)。
但我不明白的是:这怎么可能发生?
这是代码的重要部分:
elif isinstance(self.content, (bytes, bytearray)):
base85 = zlib.compress(self.content, 9)
# pad=False doesn't make a difference here
base85 = base64.b85encode(base85, pad=True).decode()
base85 = escape_xml(base85)
file.write(base85)
def escape_xml(text):
text = text.replace("&", "&")
text = text.replace("<", "<")
text = text.replace(">", ">")
text = text.replace("\"", """)
text = text.replace("'", "'")
return text
以及解码代码:
def decode_binary_data(data):
data = unescape_xml(data)
# Remove newline for mixed content support (does not apply in this case)
data = data.split("\n", 1)[0]
# Error!
data = base64.b85decode(data)
return zlib.decompress(data)
def unescape_xml(text):
text = text.replace(""", "\"")
text = text.replace("'", "'")
text = text.replace("<", "<")
text = text.replace(">", ">")
text = text.replace("&", "&")
return text
Base85 理论上可以使用85^5 = 4.437.053.125 种可能的组合,但是当它从字节中获取输入时,我想知道这怎么可能。这是来自压缩吗?这不应该是问题,因为编码和解码应该是对称的。如果是问题,无论如何如何压缩数据?
选择 Ascii85 代替 ( a84encode()
) 有效,但我认为这并不能真正解决问题,也许在其他情况下会失败?
谢谢您的帮助!