MXWXZ 发表于 2016-11-20 22:58

【原理入门】第一课:压缩原理

本帖最后由 MXWXZ 于 2017-7-19 22:39 编辑

@小飞网络 原来是看到了http://www.52pojie.cn/thread-556674-1-1.html这篇帖子,发现很多人对压缩这个东西没有概念,正好没什么事情,就写一篇简单易懂的文章谈谈吧~

QUE 1:一个文件怎么会变小了呢?
文件变小了,实际上是重复的数据被去除了,比如AABBCCDDEEFF这串文字的文件(简要起见,我们就假想计算机就是用文字存储的),我们先约定文件开头有符号D的代表每个字符重复2次,那么我们的文件便可以压缩为(D)ABCDEF,看,文件变小了吧~
当然现在的压缩算法不是这么简单的,这要涉及哈夫曼树等内容,超过了本文的讨论范畴,但就像数学再怎么难,还是要加减乘除吧?基本原理也是这样的。有兴趣的可以去翻算法导论,我就不找了^_^
如图,一个大文件=100个相同的小文件,那么我们就可以只存一个小文件然后存一个代表100的值,这样就缩小了100倍!


static/image/hrline/line7.png


QUE2:为什么要专门的压缩文件才能打开压缩包呢?
就像QUE1所讲的,如果就把保存后的(小文件+整数100)给你,你怎么知道100是100次还是10^100次方次呢……?所以要用专门的压缩软件,这样它会用一种专门的方式保存我们的(100),防止误解,当然国际上也有通用的压缩标准比如zip(膜菲利普·卡兹大神,此人的开源免费值得中国很多程序员学习- -具体的可看百度百科,你用记事本打开任何一个标准的zip文件头两个字符便是纪念此人的PK姓名缩写)。由于门槛低,所以现在许多压缩软件横行,也衍生了一大堆流氓软件,就是把zip等算法稍微改变一下,因为解释的标准不同,自然就无法解压(“快压”你好~)


static/image/hrline/line7.png


QUE3:怎样才能压缩的更小?
这是我们最关注的问题啦~一般来说,我们压缩软件都会提供一个压缩率的参考数据,这个和文件的重复性和算法的“高端性”是相关的……算法差的话甚至会变大!
压缩后的文件内容包括这些东西(最简单的):规则表+内容+其他东西,解压时用规则表去套规则内容,比如规则表规定A=I LOVE YOU,那么就把内容中的所有A替换为I LOVE YOU(就像word的字符替换),如果文件重复性差,那么就没有替换的,算法差的话,规则表说不定比原来的所有内容还大,这样反而得不偿失了。
比如一个A-Z的字母表,在标准ZIP压缩后压缩率为107%!而一个26个A的文件压缩率就是15%。



static/image/hrline/line7.png


QUE4:帖子中的36K文件如何实现的?
http://www.52pojie.cn/thread-556674-1-1.html上面分享了一个36K的4.5PB的文件,据说是某压黑科技哦……我们来看看~
首先这个软件不能用winrar等打开(提示数据已损坏),记事本打开找到了方法……下一个“某压”绿色纯净版打开= =

发现此文件有lib+.zip 16个文件,每个文件里有book+.zip 16个文件,每个文件里又有chapter+.zip 16个文件,每个文件里还有doc+.zip 16个文件,每个文件里居然还有page+.zip 16个文件,每个文件里有一个4G的0.dll(累死了),但是我们发现,每个DLL的CRC32都是一样的!也就是说这些文件都是一毛一样的!不想等st3打开了,我估计这货就是4G的空文件或者单个字符重复……所以看似很大的文件实际上就是一个字符……


我们还可以看到,每个单独的压缩包和源文件大小差不多,也就是说这么多的压缩包也就是改了一下单个字符乘的次数,保存一下自己的文件名就行了……别说4.5PB,4.5EB也不会有多大……搞不好保存文件名需要的空间都比原来0.dll还要多……(很有可能哦,原来的只需要一个字符和乘的次数,而文件名好长的)。。。
这个骗局充分证明了某压多么的NB……有本事把一部电影压到36K,或者36M也行啊,那么我们广大人民就有福了~{:17_1088:}


static/image/hrline/line7.png
附:有人玩过或者看过世界编程大赛的作品,几K或几十K就能有非常不错的画面的游戏,认为他们用了什么高端的压缩软件,事实上并不是。
那些作品是有专门的团队的,比如美工,程序员,音效等等,都尽可能的增大重复性而又不牺牲效果。
    比如小小一块图可以通过光效变换,组合构建等等构成一个物体,而存储也只需要保存一小块,其他的交给代码,场景也是动态生成的,不像我们打CS,地图都是存好的一个大文件,而他们是要用的时候通过那些基本图片加上复杂的算法构成一个场景,自然就小了,你放大了看还是会发现瑕疵的。
   音效则是通过代码“告诉”系统怎么生成下一个音符并输出,不断循环或者随机,而不是像我们的歌把音高啥的都记录下来,你录下来通过音频软件就能发现那些音符有大量的重复。
   代码则是直接用汇编来写,不用C++之类封装好了的,尽可能减少套路或者废话(当然非常复杂),然后加上复杂的算法等等,可能需要实现一个压缩,但却是专门针对自己这段代码的,用到别的文件就mengbi了……
   所以说了这么多那些作品都是大神们装13用的,你我就别想了……实际上非常耗时间,不亚于开发一款正常的游戏,而且只是在正常人的正常感知范围内尽量让人看不出来瑕疵,但和那些几十G的大游戏肯定没得比(不过下载耗时肯定完爆了几个宇宙了)

各位应该明白了吧……觉得好的顺手评个分吧……手打一篇作文呢……睡了先

jinyakun 发表于 2016-11-20 23:18

感谢分享,这个其实早就有相关阅读,只是略懂原理,也就是说压缩工具只是根据文件保存字符的规律生成一套规则,然后用规则去保存源文件,解压就是用规则还原文件

gzsklsskszngc 发表于 2016-11-20 23:53

fleetgirls 发表于 2016-11-20 23:20
图压文件是直接改后缀然后链接图标文件到图片实现的么

按你的意思那就是不是本地压缩了,而是把图片上传到服务器,待你解压的时候再自动从服务器上把图片调过来。这种方式是可以用云存储实现,比如百度云的在线解压缩,但如果文件太大的话就没意思了,想解压到电脑不就等于从新下载文件?如果生产的链接是本地的话那就更没意思了,只是把图片调到统一的文件夹下保存,等你解压的时候再从文件夹里调回来,这对于硬盘来说就算你压缩到1KB也等于没压缩一样。

咚次哒次 发表于 2016-11-20 23:16

请教楼主,那种改后缀可以变压缩文件,不改就是一张图片,是怎么实现的?{:301_982:}

fleetgirls 发表于 2016-11-20 23:20

图压文件是直接改后缀然后链接图标文件到图片实现的么

1462326016 发表于 2016-11-20 23:27

咚次哒次 发表于 2016-11-20 23:16
请教楼主,那种改后缀可以变压缩文件,不改就是一张图片,是怎么实现的?

那个我记得好像是把压缩文件直接添加到图片文件的后边,然后系统根据后缀来找文件。后缀是图片就找前一段文件,后缀是压缩文件就找后半段文件数据。。

bluezone10 发表于 2016-11-20 23:30

lz解释的很清楚,虚心学习。

15820956473 发表于 2016-11-20 23:35

真的假的?别骗我呢

gzsklsskszngc 发表于 2016-11-20 23:37

咚次哒次 发表于 2016-11-20 23:16
请教楼主,那种改后缀可以变压缩文件,不改就是一张图片,是怎么实现的?

那不过是一种伪装效果而已,只有你自己知道。难道你改了后缀后还能正常的打开吗?

五行天 发表于 2016-11-20 23:40

大概知道压缩原理,这篇解释更加详细。

loveLYF 发表于 2016-11-20 23:44

学习了 不过请教下楼主 以前别人分享过一些10m~50m左右的压缩系统有可能是真的吗 ?即使是xp
还有就是7z   我下载过一些游戏 解压后大概2g~5g    用7z压缩成700~900m左右   我自己缺压缩不成 也是用的7z是使用方法的问题吗 ?
页: [1] 2 3 4 5
查看完整版本: 【原理入门】第一课:压缩原理