关于一种节省硬盘空间的奇怪方法

另一个用户想要向硬盘写入一条新数据,但他没有足够的可用空间来执行此操作。 我也不想删除任何东西,因为“一切都非常重要和必要”。 我们应该用它做什么?

没有人有这个问题。 我们的硬盘上有数 TB 的信息,而且这个数量不会减少。 但它有多独特呢? 最后,所有文件都只是一组具有一定长度的位,并且很可能新文件与已存储的文件没有太大区别。

显然,搜索已存储在硬盘上的信息即使不是失败,也至少不是一项有效的任务。 另一方面,如果差异很小,那么你可以稍微调整一下......

关于一种节省硬盘空间的奇怪方法

TL;DR - 第二次尝试谈论使用 JPEG 文件优化数据的奇怪方法,现在以更容易理解的形式。

关于位和差

如果您获取两个完全随机的数据,那么它们包含的平均位有一半是一致的。 事实上,在每对('00')的可能布局中,恰好有一半具有相同的值,这里一切都很简单。

但是,当然,如果我们只取出两个文件并将其中一个放入第二个文件中,那么我们将丢失其中一个。 如果我们保存更改,我们将简单地重新发明 增量编码,尽管它通常不用于相同的目的,但即使没有我们,它也可以完美地存在。 我们可以尝试将较小的序列嵌入到较大的序列中,但即使如此,如果我们不顾一切地使用它,我们也会面临丢失关键数据片段的风险。

那么什么和什么之间的差异可以消除吗? 嗯,也就是说,用户编写的新文件只是一个位序列,我们不能用它本身做任何事情。 然后,您只需要在硬盘驱动器上找到可以更改的位,而无需存储差异,这样您就可以在损失后幸存下来,而不会造成严重后果。 不仅要更改 FS 本身上的文件,还要更改其中的一些不太敏感的信息,这是有意义的。 但是哪一个以及如何实现呢?

装配方法

有损压缩文件可以解决这个问题。 所有这些 jpeg、mp3 和其他文件虽然是有损压缩,但都包含一堆可以安全更改的位。 可以使用先进的技术在编码的各个阶段不知不觉地修改其组件。 等待。 先进的技术...难以察觉的修改...一点一点变成另一点......几乎就像 隐写术!

事实上,将一种信息嵌入另一种信息让人想起她的方法,这是独一无二的。 人类感官发生的难以察觉的变化也给我留下了深刻的印象。 路径分歧的地方是保密的:我们的任务归结为用户在他的硬盘驱动器上输入附加信息;这只会伤害他。 他又会忘记。

因此,虽然我们可以使用它们,但我们需要进行一些修改。 然后我将使用现有方法之一和通用文件格式的示例来告诉和展示他们。

关于豺狼

如果你真的挤压它,它是世界上最可压缩的东西。 当然,我们谈论的是 JPEG 文件。 不仅有大量的工具和现有方法可以将数据嵌入其中,而且它是这个星球上最流行的图形格式。

关于一种节省硬盘空间的奇怪方法

但是,为了不从事狗的繁殖,您需要在这种格式的文件中限制您的活动领域。 没有人喜欢由于过度压缩而出现的单色方块,因此您需要限制自己使用已经压缩的文件, 避免重新编码。 更具体地说,对于整数系数,在负责数据丢失的操作之后仍然保留 - DCT 和量化,这在编码方案中完美地显示(感谢鲍曼国家图书馆的 wiki):
关于一种节省硬盘空间的奇怪方法

有许多可能的方法来优化 jpeg 文件。 有无损优化(jpegtran),有优化”无损的“,这实际上贡献了其他东西,但我们不关心它们。 毕竟,如果用户准备将一种信息嵌入到另一种信息中以增加可用磁盘空间,那么他要么很久以前就优化了图像,要么根本不想这样做,因为担心质量下降。

F5

一整套算法都符合这些条件,您可以熟悉一下 在这个精彩的演讲中。 其中最先进的是算法 F5 由 Andreas Westfeld 设计,使用亮度分量的系数,因为人眼对其变化最不敏感。 而且,它使用基于矩阵编码的嵌入技术,这使得在嵌入相同量的信息时,所使用的容器的尺寸越大,可以进行更少的改变。

这些更改本身归结为在某些条件下(即并非总是)将系数的绝对值减少 5,这允许您使用 FXNUMX 来优化硬盘驱动器上的数据存储。 关键是,由于 JPEG 中值的统计分布,这种变化后的系数在霍夫曼编码后很可能会占用更少的比特,并且新的零在使用 RLE 对其进行编码时会带来增益。

必要的修改归结为消除负责保密的部分(密码重新排列),这可以节省资源和执行时间,并添加一种处理多个文件而不是一次处理一个文件的机制。 读者不太可能对更详细的变更过程感兴趣,所以让我们继续描述实现。

高科技

为了演示这种方法的工作原理,我用纯 C 实现了该方法,并在执行速度和内存方面进行了许多优化(即使在 DCT 之前,您也无法想象这些图片在不压缩的情况下有多重)。 使用库组合实现跨平台 库文件, PCRE и 小目录,为此我们感谢他们。 所有这些都是通过“make”组合在一起的,因此 Windows 用户希望自己安装一些 Cygwin 进行评估,或者自己处理 Visual Studio 和库。

该实现以控制台实用程序和库的形式提供。 有兴趣的人可以在 Github 存储库的自述文件中找到有关使用后者的更多信息,我将在帖子末尾附加该链接。

如何使用?

小心。 用于打包的图像是通过在给定根目录中使用正则表达式搜索来选择的。 完成后,可以在其范围内随意移动、重命名和复制文件,更改文件和操作系统等。但是,您应该非常小心,不要以任何方式更改直接内容。 即使丢失一位的值也可能导致无法恢复信息。

完成后,该实用程序会留下一个特殊的存档文件,其中包含解包所需的所有信息,包括有关所用图像的数据。 它本身重约几千字节,对占用的磁盘空间没有任何重大影响。

您可以使用“-a”标志分析可能的容量:“./f5ar -a [搜索文件夹] [Perl 兼容的正则表达式]”。 使用命令“./f5ar -p [搜索文件夹] [Perl 兼容正则表达式] [打包文件] [存档名称]”完成打包,并使用“./f5ar -u [存档文件] [恢复文件名称”解包]'。

工作示范

为了展示该方法的有效性,我从该服务上传了 225 张完全免费的狗照片集 Unsplash 并在文档中找到了第二卷45米的大pdf 编程艺术 克努塔。

该序列非常简单:

$ du -sh knuth.pdf dogs/
44M knuth.pdf
633M dogs/

$ ./f5ar -p dogs/ .*jpg knuth.pdf dogs.f5ar
Reading compressing file... ok
Initializing the archive... ok
Analysing library capacity... done in 17.0s
Detected somewhat guaranteed capacity of 48439359 bytes
Detected possible capacity of upto 102618787 bytes
Compressing... done in 39.4s
Saving the archive... ok

$ ./f5ar -u dogs/dogs.f5ar knuth_unpacked.pdf
Initializing the archive... ok
Reading the archive file... ok
Filling the archive with files... done in 1.4s
Decompressing... done in 21.0s
Writing extracted data... ok

$ sha1sum knuth.pdf knuth_unpacked.pdf
5bd1f496d2e45e382f33959eae5ab15da12cd666 knuth.pdf
5bd1f496d2e45e382f33959eae5ab15da12cd666 knuth_unpacked.pdf

$ du -sh dogs/
551M dogs/

粉丝截图

关于一种节省硬盘空间的奇怪方法

解压后的文件仍然可以并且应该被读取:

关于一种节省硬盘空间的奇怪方法

正如你所看到的,从硬盘上原来的 633 + 36 == 669 MB 数据,我们来到了更令人愉快的 551。这种根本性的差异是由系数值的减小来解释的,这影响了它们的随后的无损压缩:逐一减少可以轻松地“从最终文件中删除几个字节”。 然而,这仍然是一种数据丢失,尽管损失非常小,但您必须忍受。

幸运的是,它们是肉眼绝对看不见的。 在剧透下(因为 habrastorage 无法处理大文件),读者可以通过肉眼及其强度来评估差异,通过从原始值中减去更改组件的值获得: 原来的, 里面有信息, 差异 (颜色越暗,块的差异越小)。

取而代之的是结论

考虑到所有这些困难,购买硬盘或将所有内容上传到云端似乎是解决问题的更简单的方法。 但即使我们现在生活在如此美好的时代,也不能保证明天仍然可以上网并将所有额外数据上传到某个地方。 或者去商店给自己再买一个 XNUMX TB 的硬盘。 但您始终可以使用现有的房屋。

-> GitHub上

来源: habr.com

添加评论