使用 PAR2 为数据纠错恢复

来源:腾讯云时间:2023-02-18 10:20:36

引:

如果你是通过搜索找到本文,请注意,本文内容不适用于文件误删恢复、已经损坏的文件且无 PAR 2 恢复数据的情况。


(资料图片仅供参考)

1. 序

我们存放在存储、传输数据的过程中,往往可能伴随着很多不确定性,由于各方面原因,文件损坏也时有发生,特别是在某些网络存储平台显得更为常见,有的时候从 A 地将数据打包上传到网盘,从 B 地进行下载,尝试解包过程发生了数据错误,就很糟糕,例如这样:

损坏的压缩包

在面对这个问题的时候,第一时间想到的是某个层面上家喻户晓的 WinRAR 提供的一个功能:恢复记录,确实通过它可以对文件进行修复,而且也是一个很方便的工具,如果希望使用这个方法可以查看:这一部分内容

但不容忽视的是,WinRAR 是一个商业软件,并不是所有情况下它都可以被使用,据个人了解的所有主流压缩格式中,只有 RAR 格式是支持恢复信息的,如果不使用 RAR,那就需要其他方式来进行数据的恢复。

2. 基础概念

如果你想大概了解其原理(为什么它可以这样?),那可以看看这部分内容。

2.1. 纠错码

纠错码(ECC,error correction/correcting code)是信息传输中错误检测与纠正的工具。

查看维基百科上的纠错码词条

看不了维基百科的话也可以看看百度百科

纠错码分为两大类:分组码和卷积码。分组码适用于一连串固定长度的数据包,而每一种分组码只能用于特定长度的数据包。实际用途中的分组码一般使用硬解码方式,所需时间为每一个数据包长度的多项式时间。经典分组码的其他例子有格雷码,BCH 码,多维奇偶校验码和汉明码。卷积码适用于任意长度的位元流/符号流。接收方通常使用维特比算法将其软解码,但有时也会用其他算法。随着卷积码约束条件的长度增加,维特比解码的解码效率渐近最优;但作为代价,计算时间将以对数式增长。长度有限的卷积码也可以看作一种“分组码”,因为输入数据是成组的;但是卷积码的每一“组”长度不一,而分组码的长度是固定的,且由其特定的代数性质而定。

2.2 里德-所罗门码

本文介绍的 Par 2.0 使用的纠错码为里德-所罗门码,被广泛的应用各个领域,它是一种分组码。

里德-所罗门码是 RAID 6的标准之一,常见的二维码中的 QR 码也采用它进行纠错,也被广泛运用在 CD、DVD、蓝光光盘的校验恢复上。

具体实现过程不在此叙述,可以问问万能的搜索引擎,看看维基百科上的词条或者百度百科上的词条。

3. 创建纠错数据和恢复文件

可以实现的工具有很多,从软件维护情况、是否开源、免费等方面考虑,本文推荐的是 命令行工具 par2cmdline和带图形界面的 MultiPar,同时考虑到 WinRAR 的受众广泛,会在附中给出 WinRAR的实现方案。

本次测试使用文件:

一个 PDF 文件,大小 42384523 字节(约 40.4 MB)一个文本 TXT 文件,大小 24286 字节(约 27 KB)

需要注意:随着被处理文件的大小增大,所需的计算时间也会更长。

3.1 使用 Par2cmdline 创建恢复模块和恢复数据

推荐查看:par2cmdline 在 Github 上的页面,有完整的命令行说明。

par2cmdline 的快速帮助(可以通过 par2 -h 进行查看)

Usage:  par2 -h  : show this help  par2 -V  : show version  par2 -VV : show version and copyright  par2 c(reate) [options]  [files] : Create PAR2 files  par2 v(erify) [options]  [files] : Verify files using PAR2 file  par2 r(epair) [options]  [files] : Repair files using PAR2 filesYou may also leave out the "c", "v", and "r" commands by using "par2create","par2verify", or "par2repair" instead.Options: (all uses)  -B : Set the basepath to use as reference for the datafiles  -v [-v]  : Be more verbose  -q [-q]  : Be more quiet (-q -q gives silence)  -m    : Memory (in MB) to use  -t    : Number of threads used for main processing (6 detected)  -T    : Number of files hashed in parallel             (2 are the default)  --       : Treat all following arguments as filenamesOptions: (verify or repair)  -p       : Purge backup files and par files on successful recovery or             when no recovery is needed  -N       : Data skipping (find badly mispositioned data blocks)  -S    : Skip leaway (distance +/- from expected block position)Options: (create)  -a : Set the main PAR2 archive name  -b    : Set the Block-Count  -s    : Set the Block-Size (don"t use both -b and -s)  -r    : Level of redundancy (%%)  -r : Redundancy target size, =g(iga),m(ega),k(ilo) bytes  -c    : Recovery Block-Count (don"t use both -r and -c)  -f    : First Recovery-Block-Number  -u       : Uniform recovery file sizes  -l       : Limit size of recovery files (don"t use both -u and -l)  -n    : Number of recovery files (don"t use both -n and -l)  -R       : Recurse into subdirectoriesExample:   par2 repair *.par2

3.1.1 创建恢复数据

最简单的可以直接根据默认参数进行创建:

./par2 create demo.pdf.par2 demo.pdf# Block size: 21196# Source file count: 1# Source block count: 2000# Recovery block count: 100# Recovery file count: 7# # Opening: demo.pdf# Computing Reed Solomon matrix.# Constructing: done.# Wrote 2119600 bytes to disk# Writing recovery packets# Writing verification packets# Done

即可获得恢复文件:

demo.pdf 和创建好的 par 文件

根据其帮助的用法,使用 -r 可以指定恢复数据的大小(百分比或固定大小),使用 -b 可以设置恢复块数量,使用 -s 可以设置恢复块大小,需要注意 -s 给出的参数需能被 4 整除。

-s 参数的例子:

par2 create -s24288 demo.txt.par2 demo.txt

-r、-b 参数的例子:

# 创建文件大小的 15% 恢复数据par2 create -b v10240 -r15% demo.pdf.par2 demo.pdf# 创建约 4 M 大小的恢复数据par2 create -rm4 demo.pdf.par2 demo.pdf

恢复按块进行恢复,恢复数据的大小由块的数量和大小决定(所以不可以同时设置块的数量和块的大小),同样大小的恢复数据,不同参数和不同损坏情况是否能恢复可能产生不同的结果,所以针对可能出现的不同的文件损坏情况合理设置参数很重要。

3.1.2 进行文件修复

可以通过 par -v 文件名来对文件进行校验,如:

par2 v demo.pdf.par2

得到输出:

Loading "demo.pdf.par2".Loaded 4 new packetsLoading "demo.pdf.vol000+01.par2".Loaded 1 new packets including 1 recovery blocksLoading "demo.pdf.vol001+02.par2".Loaded 2 new packets including 2 recovery blocksLoading "demo.pdf.vol003+04.par2".Loaded 4 new packets including 4 recovery blocksLoading "demo.pdf.vol007+08.par2".Loaded 8 new packets including 8 recovery blocksLoading "demo.pdf.vol015+16.par2".Loaded 16 new packets including 16 recovery blocksLoading "demo.pdf.vol031+32.par2".Loaded 32 new packets including 32 recovery blocksLoading "demo.pdf.vol063+64.par2".Loaded 64 new packets including 64 recovery blocksLoading "demo.pdf.vol127+54.par2".Loaded 54 new packets including 54 recovery blocksLoading "demo.pdf.par2".No new packets foundThere are 1 recoverable files and 0 other files.The block size used was 21196 bytes.There are a total of 2000 data blocks.The total size of the data files is 42384523 bytes.Verifying source files:Opening: "demo.pdf"Target: "demo.pdf" - found.All files are correct, repair is not required.

表明文件未损坏,对文件使用十六进制编辑器进行随机修改,来模拟文件损坏情况,再执行 par -v可得到如下输出:

# ...Verifying source files:Opening: "demo.pdf"Target: "demo.pdf" - damaged. Found 1999 of 2000 data blocks.Scanning extra files:Repair is required.1 file(s) exist but are damaged.You have 1999 out of 2000 data blocks available.You have 181 recovery blocks available.Repair is possible.You have an excess of 180 recovery blocks.1 recovery blocks will be used to repair.

表明文件可以被修复:

par2 r demo.pdf.par2

部分输出内容:

Computing Reed Solomon matrix.Constructing: done.Solving: done.Wrote 42384523 bytes to diskVerifying repaired files:Opening: "demo.pdf"Target: "demo.pdf" - found.Repair complete.

修复成功。

若文件损坏过于严重或恢复块数据不足则无法恢复文件,这里给出对 demo.pdf 仅设置 1 个恢复块但损坏出现在了不同的两块中的情况则无法进行恢复,执行验证或恢复指令会得到如下输出:

Verifying source files:Opening: "demo.pdf"Target: "demo.pdf" - damaged. Found 1998 of 2000 data blocks.Scanning extra files:Repair is required.1 file(s) exist but are damaged.You have 1998 out of 2000 data blocks available.You have 1 recovery blocks available.Repair is not possible.You need 1 more recovery blocks to be able to repair.

3.2 使用 MultiPar 创建恢复模块和恢复数据

可以看看:MultiPar 在 Github 上的页面

MultiPar 的整体思路和参数含义和 par2cmdline 相似,GUI 的操作会更便捷。

在 MultiPar 的文档中看到作者为了获得更高速度所做的努力,其描述:

Pros:Fast verification.Fast recovery.Less disk space.Cons:Backup of damaged files is disabled.Less finding available source blocks.Cannot treat splited source files.Cannot treat additional source files.Cannot treat external source files.Risk of more data loss at failed recovery.

3.2.1 创建恢复数据

提示:警惕恶意软件,建议前往 Github 的 Release 页面进行 下载。

通过 GUI 设置参数,进行操作即可:

创建恢复数据
创建成功

验证数据:

未损坏的文件校验结果

3.2.2 恢复数据

打开MultiPar,点击打开,选择 par2 文件进行校验

损坏数据的校验结果
修复成功
恢复块不足,无法恢复

使用 WinRAR 创建恢复模块和恢复数据

注:只有 RAR 格式可进行恢复卷设置。

在创建压缩包时勾选添加恢复记录,并设置恢复数据大小:

恢复记录
设置恢复记录大小

在文件损坏的压缩包内点击修复压缩文件:

修复压缩文件

按提示进行操作,修复结果:

修复成功

标签:

相关阅读

推荐阅读

拼多多第三季度营收355亿元  与去年同期相比增长65%

拼多多第三季度营收355亿元 与去年同期相比增长65%

拼多多第三季度总营收355亿元,与去年同期相比增长65%;2第三季度归属拼多多股东的净利润为106亿元,同比暴增546%;3拼多多第三季度摊薄后每 更多

2022-11-29 09:57:07
西安楼市松绑  新房、二手房价格环比连跌数月

西安楼市松绑 新房、二手房价格环比连跌数月

继杭州、成都之后,又一热点二线城市对楼市进行局部松绑。19日,西安市住建局发布《关于支持刚性和改善性住房需求有关问题的通知》(下称通 更多

2022-11-21 09:45:30
跨省跟团游订单量增长255%  火车票预订量环比前日增长1倍

跨省跟团游订单量增长255% 火车票预订量环比前

11月15日,文化和旅游部发布《关于进一步优化新冠肺炎疫情防控措施 科学精准做好文化和旅游行业防控工作的通知》(以下简称《通知》)指出, 更多

2022-11-16 17:27:26
前10个月进出口同比增长9.5%  外贸继续保持平稳运行

前10个月进出口同比增长9.5% 外贸继续保持平稳运行

昨天,海关总署公布,今年前10个月,我国外贸进出口总值34 62万亿元,同比增长9 5%,外贸继续保持平稳运行。其中出口19 71万亿元,同比增长 更多

2022-11-08 17:28:44
前三季度国内生产总值870269亿元  同比增长3.0%比上半年加快0.5个百分点

前三季度国内生产总值870269亿元 同比增长3.0%

国家统计局10月24日发布数据,经初步核算,前三季度我国国内生产总值870269亿元,按不变价格计算,同比增长3 0%,比上半年加快0 5个百分点 更多

2022-10-24 13:53:11
10家鞋企中有2家企业今年上半年净利润处于增长状态  鞋企表现有喜有忧

10家鞋企中有2家企业今年上半年净利润处于增长状

近日,10家鞋履上市企业陆续公布了上半年的业绩。从数据来看,今年鞋履行业的整体业绩承压,增速有所放缓。在此背景下,鞋企也纷纷尝试转型 更多

2022-09-05 09:51:45
291家科创板公司实现营业总收入合计同比增长28.93%  科创板中报业绩有望继续领跑

291家科创板公司实现营业总收入合计同比增长28.93

下周,中报披露即将收官。根据Wind统计,截至26日下午5点,已有291家科创板公司发布中报,占全部科创板总数的63 68%。若剔除8月以来上市的 更多

2022-08-29 09:40:59
沪深A股震荡走低  保险、农业板块逆市走强

沪深A股震荡走低 保险、农业板块逆市走强

周三,沪深A股震荡走低,保险、农业板块逆市走强,元器件、半导体、汽车板块跌幅居前。昨日上证综指下跌61 02点,跌幅为1 86%;深证成指下跌 更多

2022-08-25 10:11:27
+ 点击查看更多精彩
西安楼市松绑  新房、二手房价格环比连跌数月
    继杭州、成都之后,又一热点二线城市对楼市进行局部松绑。19日,...
10家鞋企中有2家企业今年上半年净利润处于增长状态  鞋企表现有喜有忧
    近日,10家鞋履上市企业陆续公布了上半年的业绩。从数据来看,今...
291家科创板公司实现营业总收入合计同比增长28.93%  科创板中报业绩有望继续领跑
    下周,中报披露即将收官。根据Wind统计,截至26日下午5点,已有29...
沪深A股震荡走低  保险、农业板块逆市走强
    周三,沪深A股震荡走低,保险、农业板块逆市走强,元器件、半导体...
两单保障性租赁住房REITs提前结束募集 两只基金公众认购规模已超初始募集规模上限
    8月16日,上交所官网显示,中金厦门安居REIT、华夏北京保障房REIT...
受天气影响部分鲜菜供应减少价格上涨  7月本市CPI环比由降转升同比上涨2.1%
    昨天,国家统计局北京调查总队发布数据显示,7月北京居民消费价格...