文件压缩如何工作?


19

因此,我今天意识到我认为文件压缩是理所当然的。我可以接受的事实是,可以将几个文件捆绑在一起,并且比任何文件都小,这是事实,但是它实际上是如何工作的呢?

我对它的了解有限,其中包括与用指针替换所有重复项以缩小方式有关的事情,但是除此之外,我还是一无所知!

我一直对新知识持开放态度,就像我想象中的大多数人一样,我想问一下。那么,SuperUser,压缩实际上是如何工作的?


1
维基百科的文章是一个良好的开端,但它会是不错的有更具体的解释。好问题(尽管我确定我们已经有这样的问题,但似乎没有)。
Gnoupi

2
@Gnoupi:确实,我要做的第一件事就是搜索,因为我确定这里是一个。显然不是,所以我试图纠正这一问题:P
Phoshi

2
当您发布图片并进入“糟糕的天气?”时,我们会得到一个“ What-is”标签。我一直注意到需要“工作方式”标签,但这太长了,“工作方式”听起来很愚蠢。“解释”可能做到这一点。
quack quixote 2010年

@quack quixote:啊,谢谢。我在自动填充中寻找“ plz-发送-解释”类型的标签,但找不到。
Phoshi

2
我已经接近创建几次“ how”标签了……但是“ explain”可能更好。“教程”,“方法”和“初学者”都是半适用的,但不太适合。
quack quixote

Answers:


18

无损压缩

无损压缩是没有数据丢失的地方。输入的所有内容都可以完美检索。这适用于文本或二进制文件,其中将注意到最小的错误。

文件压缩的​​工作原理是:获取文件并扫描模式,然后将这些模式转换为占用更少空间的其他内容。

例如,“ AAAAAAAA”可以变成“ 8A”。

当然,这不是它的确切工作方式,因为那样您就会遇到如果“ 8A”是纯文本格式的问题。您将解压缩文件,这将是错误的。维基百科或LZW数据压缩算法是一个不错的起点。

下面复制了一些简单的伪代码:

STRING = get input character
WHILE there are still input characters DO
    CHARACTER = get input character
    IF STRING+CHARACTER is in the string table then
        STRING = STRING+character
    ELSE
        output the code for STRING
        add STRING+CHARACTER to the string table
        STRING = CHARACTER
    END of IF
END of WHILE
output the code for STRING

所有压缩都使用查找字典,该字典用于压缩和解压缩文件。字典越大,则压缩得越多,尽管您确实遇到了收益递减定律

还值得注意的是,压缩并不总是产生较小的文件。在某些情况下(文件较小或压缩随机数据时),压缩后将不会得到较小的文件。压缩随机数据的能力面临一些有趣的挑战

“有损”压缩

以上主要涉及无损压缩。视频/音频应用中使用的其他类型的压缩(例如MP3,JPG和h.264)是有损压缩的示例。

有损压缩通过丢弃最不可能引起注意的数据来工作。音频中的声音约为30,000 Hrz,低于100 Hrz,还有其他各种事物。在图片(静态)中,它会删除各种内容并将像素混合在一起,并丢弃数据。

有损压缩是变换编码的一种形式。它对数据进行平均以减小整体大小。例如,图像中的一个10像素的块,可以将所有略有不同的颜色合并在一起成为一种颜色,然后进行压缩。

在视频压缩中,通常会放置指令以仅重绘自上一帧或关键帧以来发生变化的像素。


请注意,这仅是针对无损压缩的说明,您可以为其恢复确切的初始数据(归档程序最可能使用的数据)。还有其他类型的压缩中,你失去了更小的尺寸质量,JPG用于例如,MP3等
Gnoupi

Josh的第一个示例是一种称为“运行长度编码”的实际压缩方法的形式,“ 8A”将被压缩为“ 181A”。显然他的最后一段在这里适用;RLE最适合重复很多的数据。
Dour High Arch

3
我添加了无损/有损标题,并将其四舍五入。值得一提的是,进一步了解这一点的最佳方法是简单地阅读Wikipedia文章。
乔什(Josh K)2010年

5

压缩的工作方式是在数据中找到模式,然后用特殊的较小模式替换这些模式。减压是相反的:找到特殊的模式,并用它们代表的较大模式替换它们。了解哪种模式很重要;例如,在文本中找到的图案可能与在图像中找到的图案完全不同。一些压缩技术是有损的;它们不能保证扩展将完全恢复输入。如果损失足够小,通常适合模拟数据,例如音乐和图像。但是,必须使用无损技术来压缩文本等数据。

重要的是要意识到,即使是单个位,也不可能无损地压缩随机数据。考虑一个具有N位二进制数据的文件。有2 ^ N个可能的文件。如果将这些文件中的任何一个压缩一个位,那么压缩文件的大小为N-1位,则只有2 ^(N-1)个可能的压缩表示形式。换句话说,每个可能的压缩文件必须代表多个可能的未压缩文件。没有唯一的压缩表示,解压缩算法将无法保证无损解压缩。


3
文件可能未压缩(形容词),但无法解压缩(动词)。而是将其解压缩
quack quixote
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.