首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >base85编码字符串解码过程中的base85溢出错误

base85编码字符串解码过程中的base85溢出错误
EN

Stack Overflow用户
提问于 2019-06-10 17:24:57
回答 2查看 1K关注 0票数 2

我需要将二进制数据嵌入到XML文件中,因此我选择了使用base85编码。

我有一个很大的字节数组,其中充满了通过struct.pack()通过bytearray.extend(struct.pack(varying_data))调用的输出。然后用zlib压缩,用base64.b85encode()编码。

这一直有效,但是对于单个输入文件,有以下奇怪的错误:

代码语言:javascript
复制
ValueError: base85 overflow in hunk starting at byte 582200`

然后,我修改了bytes 64.py,以打印出当前块有哪些值以及它由哪些字节组成。输入块为b'||a|3',其值为b'||a|3',其值大于256^4 = 4.294.967.296,因此不能用四个字节表示(这是错误的来源)。

,但我不明白的是:这怎么会发生呢?

这是守则的重要部分:

代码语言:javascript
复制
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)
代码语言:javascript
复制
def escape_xml(text):

    text = text.replace("&", "&")
    text = text.replace("<", "&lt;")
    text = text.replace(">", "&gt;")
    text = text.replace("\"", "&quot;")
    text = text.replace("'", "&apos;")

    return text

以及解码代码:

代码语言:javascript
复制
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("&quot;", "\"")
    text = text.replace("&apos;", "'")
    text = text.replace("&lt;", "<")
    text = text.replace("&gt;", ">")
    text = text.replace("&amp;", "&")

    return text

Base85理论上可以使用85^5 = 4.437.053.125可能的组合,但是当它从字节中获得输入时,我想知道这是怎么可能的。这是压缩的结果吗?这不应该是问题,编码和解码应该是对称的。如果是问题,如何压缩数据呢?

选择Ascii85代替(a84encode())是可行的,但我认为这并不能真正解决问题,也许在其他情况下会失败吗?

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-11 20:29:28

我发现问题了!base85算法和压缩都不是问题所在。它是XML。

为了用包含的base85字符串导出/编写XML,我编写了自己的类和函数来导出XML,使其看起来很漂亮(xml.etree.ElementTree将所有内容都写进一行,对于这个项目,我不能使用来自pip的外部包)。这就是为什么必须手动转义base85字符串的原因。

但是,对于读取XML文件,我使用xml.etree.ElementTree我不知道大多数XML库(Un)会自动转义字符串(这很有道理)。

因此,问题在于手动释放,这是ElementTree自动完成的。因此,base85字符串两次未转义。而且,由于base85字母表包含XML转义字符串($amp;$lt;等)中包含的每个字母,并且该base85字符串中有超过500.000个字符,很可能输出字符串中的字符组合构成了一个有效的XML转义字符串。

这就是问题所在。&lt;包含在未转义的base85字符串中,并再次未转义,导致以下所有字节的偏移导致此错误。

票数 0
EN

Stack Overflow用户

发布于 2019-12-29 22:45:09

我经常使用LabView、,并且必须为LabView创建自己的Base85编码和解码例程,后者只有MD5校验和。为了加密或良好的混淆,您必须自己滚。也许未来版本的LabView将在库中使用Base85。

我要指出的一点是,我现在有了所有三种口味的base85。Ascii85,Base85和Z85。在将base10转换为base85时,每个字符集都有其使用的唯一字符集。每个版本都可以被控制字符、一行中太多的空格字符、HTML和XML等符号密集型的内容、超过126个字符(Tilde)之类的东西绊倒(损坏的输出)。

为了安全地编码大型文本文件,特别是多行和符号繁重的内容,我只需了解所有这些潜在的问题,并首先转换为十六进制。是的,它使字符数加倍,但是base10 to base85引擎不会崩溃。即使对于大型纯文本文件,Z85也会在大约1000个字符之后崩溃,问题是Z85 char映射,它的符号不符合十进制顺序,因此在长字符串上会发生溢出。出于我自己的目的,我更改了Z85字符映射,使符号按十进制顺序排列,现在Z85不再在大型文件上崩溃。

无论是用python、javascript还是LabView编写的,由于上述相同的问题,Ascii85、Base85和Z85都会崩溃。通常是多个连续符号/空格导致数学溢出,因此输出被破坏,无法解码。

注意:这是非常重要的垫您的字符串是可被4除法,当解码垫您的散列'u‘或一个倾斜符号,所以哈希是可除以5。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56530892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档