gpt4 book ai didi

python - 将数据压缩成最小数量的文本?

转载 作者:太空狗 更新时间:2023-10-30 02:51:12 24 4
gpt4 key购买 nike

我有要转换为可以复制/粘贴/通过电子邮件发送的文本的数据(主要是一系列的numpy数组)。我创建了执行此操作的以下公式。

def convert_to_ascii85(x):
p = pickle.dumps(x)
p = zlib.compress(p)
return b64.b85encode(p)

我的问题是它产生的字符串比需要的更长,因为它仅使用字母,数字和符号的子集。如果我能够使用unicode进行编码,我觉得它可以产生较短的字符串,因为它可以访问更多字符。有没有办法做到这一点?

编辑以澄清:
我的目标不是最小的数据/信息/字节数。 我的目标是减少字符的数量。原因是我通过其发送数据的 channel 是用字符(准确地说是100k)而不是字节(奇怪,我知道)限制的。我已经测试过可以发送100k unicode字符,但是我不知道如何将字节转换为unicode。

最佳答案

更新:我刚刚看到您更改了问题,以澄清您关心的是字符长度而不是字节长度。这是一个非常奇怪的约束。我从来没有听说过。我不知道该怎么做。但是,如果这是您的需要,并且您想要可预测的阻止行为,那么我认为您的问题非常简单。只需选择可以表示最多可能的唯一字符的兼容字符编码,然后在该字符集上映射二进制文件的块,以使每个块都是最长的块,但其位数少于您的可表示字符的位数字符编码。每个这样的块然后成为单个字符。由于这种约束有点奇怪,所以我不知道是否有图书馆可以做到这一点。

UPDATE2:我对以上内容感到好奇,我只是Google搜索并找到了这个文件:https://qntm.org/unicodings。如果您的工具和通讯 channel 可以处理UFT-16或UTF-32,那么您可能会寻求使用它。如果是这样,我希望本文能为您提供所需的解决方案。我认为本文仍在针对字节长度与字符长度进行优化,因此也许这将无法提供最佳解决方案,但它只能提供帮助(每个字符32个潜在位,而不是7或8)。我找不到任何试图在字符数上进行优化的东西,但是也许像Base65536这样的UTF-32方案是您的答案。 checkout https://github.com/qntm/base65536

如果您关心的是字节长度,并且想要坚持使用通常所说的“可打印字符”或“普通可打印文本”,那么这就是我的原始答案...

有一些选项可以从Base85以外的编码中获得更好的“可读文本”编码空间效率。还存在放弃更多空间效率并选择Base64的情况。在这里,我将同时使用Base85和Base64。如果您可以使用Base85,则二进制文件的膨胀只会降低25%,这样做可以省去很多麻烦。

如果试图将任意二进制编码为“纯文本”,Base85几乎是您将要做的最好的事情;如果您希望“纯文本”编码可以从逻辑上分解为有意义的东西,Base85是您可以做的最好的事情。 ,可预测的块。从理论上讲,您可以使用在高ASCII范围内使用可打印字符的字符集,但是经验表明,如果许多工具和通讯 channel 无法处理直接二进制,则它们不能很好地处理高ASCII。尝试使用每4个二进制字节中额外的5位,则没有太多的额外空间节省,因此使用256位高ASCII与128位ASCII可能会使用这些额外空间。

对于任何BaseXX编码,该算法都会采用传入的二进制位,并使用其可使用的XX可打印字符对它们进行尽可能严格的编码。 Base85将比Base64紧凑,因为它使用的打印字符(85)比Base64(64个字符)更多。

标准ASCII中有95个可打印字符。因此,存在一个Base95,它是使用所有可打印字符的最紧凑的编码。但是尝试使用所有95位都很麻烦,因为这会导致传入位的阻塞不均匀。每4个二进制字节映射到少于5个字符的小数部分。

原来,您需要将85个字符编码为4个字节,恰好将其编码为5个可打印字符。许多人会选择增加大约10%的额外长度,以达到每4个编码字节导致精确5个ASCII字符的事实。这只是二进制文件大小的25%膨胀。对于它所节省的所有头痛,这根本不是一件坏事。因此,Base85背后的动机。

Base64用于生成更长但问题更少的编码。不使用对各种文本文档造成麻烦的字符,例如HTML,XML,JSON等。这样,Base64在几乎任何上下文中都可以使用,而无需进行任何转义。您必须更加小心使用Base85,因为它不会抛出任何这些有问题的字符。为了提高编码/解码效率,它使用从33(而不是32)开始的范围从33(“!”)到117(“u”),以避免出现经常出现问题的空格字符。 'u'上方不使用的字符没什么特别的。

这就是二进制-> ASCII编码方面的故事。另一个问题是在将二进制表示形式编码为ASCII之前,您可以采取什么措施来减小表示形式的大小。您选择使用pickle.dumps()zlib.compress()。如果这些是您最好的选择,则留给其他讨论...

关于python - 将数据压缩成最小数量的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56728076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com