【发布时间】:2015-11-26 00:49:16
【问题描述】:
这个想法已经在我脑海中流动了 3 年,但我在应用它时遇到了问题 我想创建一个压缩算法,将文件大小减半
例如8 mb 到 4 mb
凭借一些搜索和编程经验,我理解了以下内容。
让我们获取一个带有字母 (a,b,c,d) 的 .txt 文件
使用IO.File.ReadAllBytes 函数,它给出以下字节数组:(97 | 98 | 99 | 100),据此:https://en.wikipedia.org/wiki/ASCII#ASCII_control_code_chart 是字母的十进制值。
我想到的是:如何通过将每个 2 个成员组合成一个成员,在数学上将这个 4 成员数组切割成只有 2 个成员的数组,但你不能简单地在数学上组合两个数字并简单地将它们反转回来因为你有很多可能性,例如
80 | 90 : 90+80=170 但没有办法知道 170 是 80+90 的结果,而不是 100+70 或 110+60。
即使你能克服这个问题,你也会受到数组单个成员中字节最大值(255 个字节)的限制。
我知道大多数压缩算法都使用二进制压缩并且它们是成功的,但是想象一下将文件大小减少一半,我想听听您对此的想法。
最好的问候。
【问题讨论】:
-
看看Huffman Coding。压缩的基本要点是您将
80 | 90组合替换为某种占位符。解码时,在表格中查找占位符并获取原始字节。 -
我知道霍夫曼,但它无法达到我的目标(半尺寸压缩)我需要一种更简单的方法来组合 0~255 范围内的数字
-
你能告诉我们你的数据集中有多少个
A | B字节组合吗? -
实际上没有数据集,这只是一个示例,我只有一个 97 的数组 | 98 | 99 | 100 原来是 abcd
-
“将文件大小减半”是什么意思?什么样的文件(如果你允许任何文件,你可以一次又一次地压缩结果,最终得到一个 0 字节的文件——这是不现实的)。如果文件中包含的信息小于文件占用的磁盘空间(在霍夫曼编码中表示为“熵”),则只能压缩文件。因此,如果文件确实占用了所需空间的两倍,则只能将文件压缩到其原始大小的 50%。