压缩包损坏修复功能详解
压缩包损坏修复功能的一些内容分享
序
在 帖子今天才知道关于压缩格式的事 里看到了对不同压缩软件/格式的讨论:
今天才知道关于压缩格式的事
rar压缩主要是可以添加冗余,出现点小损坏可以修复回来,应对就是上传过程中或者移动过程中出现的丢失,压缩包可以添加回复记录,大小自己定,分卷压缩还能添加回复分卷
自己之前也有类似的想法,并尝试进行了简单的研究,也有一些分享,看了看似乎没有关于这些的讨论,故开个贴来说一说自己的经验。
----------------------
快速阅读
文件之所以能修复部分损坏,核心在于“前向纠错”(FEC)技术中的里德-所罗门码(RS codes)。通过预先为文件添加冗余的恢复数据,在文件出错时反推出原始内容;
WinRAR 的“恢复记录”是此技术的典型应用,但 7z、ZIP 等格式本身不支持。不过,任何文件都可通过 Par2 等第三方工具手动创建独立的恢复文件,达到类似效果;
恢复能力取决于冗余“数据块”的数量。例如,创建 5 个恢复块,就能修复任意 5 个数据块的损坏,无论这些块是轻微出错还是完全损坏。目前实践几乎无法应对会波及大量数据块的随机、零散损坏。
----------------------
问题探讨
约定和前提
● 压缩包的实质是一个文件,为了方便,后续在可能有更广阔的适用范围的时候,会直接说“文件”,也包含了压缩包。
● 这次讨论中不讨论具体的算法实现,忽略一些影响不大的细节,以适应站点目标人群的角度进行考虑。
● 所有内容都是个人见解,受个人能力、精力、时间等限制,可能存在片面甚至错误内容,不应在没有自行考证前将本文作为正确内容进行参考。
● RAR 是闭源软件,这里所提 RS Codes 仅为普遍猜测,不保证一定正确。
问题
正如序言中引用帖子所说,“出现点小损坏可以修复回来”,对于一个文件而言,损坏是可以被量化的,那么接下来就以问题 为什么损坏的文件可以恢复?多小的损坏是可以被恢复的?非RAR软件是否有纠错方法?压缩软件的恢复卷是什么? 为核心进行分享。
理论知识
前向纠错
首先,为什么可以恢复?一定是有一个算法,能对数据进行校验,并对发现的校验错误进行修复。数据校验很简单也很基础(至少对于看到这里的人来说是这样的),奇偶校验、CRC、哈希等诸多方法都是在进行数据校验,在佬友们学习网络通信相关课程的时候,一定听到过类似的内容:
串行通信中使用常用明显的,我们所熟知的这些数据校验方法只能得到“数据有没有错”的结论,却不知道数据怎么错的,也就是“数据错在了哪里”(对于二进制数据,只需要知道数据错在了哪里,对其取反就可以进行修正),这也是 TCP 自动重传的原因,但在移动互联网、卫星通信这些很容易出错的场景下,频繁的重传很难满足需要,所以有了 前向纠错(Forward Error Correction, FEC),核心思想就是主动在数据里加入一些的冗余信息,让接收方在发现小错误时能自行修复。奇偶校验,IP、TCP、UDP 协议的头部使用校验和 (Checksum),以太网帧使用循环冗余校验 (CRC)来校验数据。TCP 传输遇到错误会通过自动重传请求来缓解。
FEC 已经在生活中被广泛应用了,例如:
● 移动互联网领域 3GPP TS 38.212 规范中使用了 LDPC 码和 Polar 码进行前向纠错;
● Wi-Fi IEEE 802.11ax 使用了LDPC 码或 BCC 码;
● 光纤通信 ITU-T G.709 使用SD-FEC;
● WebRTC / QUIC 等常用应用层协议通过应用层的设计,实现了部分的FEC。
里德-所罗门码
里德-所罗门码 (Reed-solomon codes,RS codes)是 FEC 编码中的一种,但被广泛运用到了其他通讯外的其他领域,常见的二维码就是通过它进行的纠错,即使二维码被部分遮挡,扭曲,也能恢复出其中的内容。
虽然是一个很重要的内容,但正如前所约定,我们不在这里探讨具体的算法实现,如果感兴趣请自行了解,如果对这些内容一头雾水,或者有兴趣继续了解,不妨看看:
'+this.href);'>bilibili.com
<a href='https://www.bilibili.com/video/av499846415/' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>【官方双语】汉明码Pa■t1,如何克服噪■_哔哩哔哩_bilibili
本期视频是关于纠错码的启发式的介绍。更多信息请看下方评论。翻译:Jerry黄豆、Saniac、Small 校对:ZSC 时轴:愚者Hamming codes, h■w to ov■rco■e n■ise.https://youtu.be/X8jsijhllIA, 视频播放量 294317、弹幕量 1410、点赞数 13735、投硬币枚数 8273、收藏人数 7446、转发人数 3916, 视频作者 3Blue1Brown, 作者简介...
根据 Wiki 中的介绍:
里德-所罗门码是定长码。这意味着一个固定长度输入的数据将被处理成一个固定长度的输出数据。在最常用的(255,223)里所码中,223个里德-所罗门输入符号(每个符号有8个比特)被编码成255个输出符号。不难得到一个小推论,RS codes 是基于“数据块”工作的。
压缩软件中的纠错
一个很让人遗憾的事实是,除了 RAR 主流的压缩软件格式都没有数据纠错的功能,甚至可以说这是 WinRAR 独有的功能。不过依然可以自己通过前向纠错的算法来生成这部分冗余想修复文件。
首先看 WinRAR 是如何完成这部分内容的,看了看 LLM 生成的内容,基本和想要说的差不多,直接给出
对于其他文件(包括非 7z 等非 RAR 压缩包)可以使用利用一些工具生成恢复数据,只需要把这些恢复数据和原始文件放在一起也可以近似(实际不如 RAR)认为是带有恢复数据了(x
推荐的一些工具:
命令行工具:
<a href='https://github.com/Parchive/par2cmdline' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>github.com
<a href='https://github.com/Parchive/par2cmdline' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>GitHub - Parchive/par2cmdline: Official repo for par2cmdline and libpar2
Official repo for par2cmdline and libpar2
带 GUI 的工具:
<a href='https://github.com/Yutaka-Sawada/MultiPar' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>github.com
<a href='https://github.com/Yutaka-Sawada/MultiPar' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>GitHub - Yutaka-Sawada/MultiPar: Parchive tool
Parchive tool
具体使用不过多赘述,几乎都是所见即所得,早年完成其他文章时候的截图:
那么就剩最后的问题:多小的损坏是可以被恢复的?或者说,这个恢复记录能容许多大损坏发生的情况下还原数据?
手动创建 Par2 数据块,则可以手动设置每一个块的大小、和分块数量的,如果已知了分块数量和大小,就可以量化的计算这些恢复数据可以抵抗多大的损坏。
假设有一个 1 GB 的数据文件,对其分成 100 个约 10M 的数据块,设置 5 个冗余块(约50M,占总量的5%),那么这个文件就可以抵抗不超过 5 个块内的数据的损坏。这里需要注意,这个损坏是针对这一个逻辑块而言的,这一个 10M 的数据块,全部错误和只有 1 bit 出现错误在修复上几乎是等价的。所以我们可以近似认为,当这个文件出现了 5 处以内的不跨数据块的连续错误,那就可以进行恢复。
在实际实践中,出于性能、存储开销等各方面原因,会限制分块数量上限(例如之前推荐的 MultiPar 很可能是使用了一个有符号的int16作为分块序号,这样导致工具最多支持 32767 个块),WinRAR由于闭源且很多参数不公开,较难进行考证,但在实际实践中表现也较为优秀。
虽然 RS Codes 配合矩阵化处理(交叉编织)解码器有能力应对一些随机错误,但在实际实践过程中,无论是 RAR 还是现有的 Par2 工具,都很难达到数学计算上的结果,至少目前来说,随机噪声对文件的破坏是灾难性的。
题外话
在很久之前的刻板认知里,WinRAR 是一个喜欢弹广告的不那么好用的软件,至少和其他干净的同类软件相比(如 Bandizip)。在某次需要对数据进行备份存档的时候,详细了解了纠错的这些细节,越发觉得WinRAR是一个优秀的工具,正如在查阅相关资料的时候不知道从哪看到的: 如果追求一站式的压缩和修复体验,WinRAR是唯一的选择。
2 posts - 2
<a href='https:///t/topic/1175978' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>
via <a href='https:///t/topic/1175978' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'> - (author: 青)
Invalid media:
<a href='https:///uploads/default/original/4X/2/a/0/2a071328242e13330aedb7f01c14f73728e98d06.png' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>image
<a href='https:///uploads/default/original/4X/f/8/2/f82f829e42a1028f22d0476f93ba8024043f4c78.png' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>image
<a href='https:///uploads/default/original/4X/4/7/6/4761ff5502e2162a8c2dc66970a4c685f8b6542e.png' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>image
<a href='https:///uploads/default/optimized/4X/e/6/3/e6331505827cac13727056fc3b6112f656082b5c_2_690x344.png' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>image
<a href='https:///uploads/default/optimized/4X/0/4/a/04a325efacd2f1b5e2866be52de4a7cfa64257ab_2_690x344.png' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>image
<a href='https:///uploads/default/original/4X/9/9/5/99507e46a3622d676c78879df8efbd260a9339cf.png' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>image
<a href='https:///uploads/default/original/4X/e/b/0/eb0583a5a25a74ce2c2c59c747677684c6d9ae69.png' target='_blank' rel='noopener' onclick='return confirm('Open this link?
'+this.href);'>image
评论已关闭