CRC是校验文件与压缩问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CRC是校验文件与压缩问题相关的知识,希望对你有一定的参考价值。

参考技术A CRC是校验文件,经常在与压缩和解压相关的文件或软件中.任何文件损坏之后,都应该从其它渠道获得未损坏的相同文件来来替换已经损坏的文件.
判断出错原因
出错信息为“CRC失败于加密文件(口令错误?)”(RAR
压缩包
设了密码,但密码输入错误或是密码输入正确但
循环冗余校验码
(CRC)出错!只不过因为此RAR压缩包加了密码的缘故,所以WRAR才猜测说可能是“口令错误”)
区分上面两种错误的方法:如果密码输入错误的话是无法解压出任何文件的!但如果压缩包内有多个文件,且有一部分文件
解压缩
出来了,那么应该是RAR压缩包循环冗余校验码(CRC)出错而不是密码输入错误。
循环冗余校验码(CRC)出错,这是最常见的情况,这也是本文讨论的重点!和上面的几种解压缩出错不同,这种情况是和RAR压缩包损坏有关的。
原因有几种:
(1)
网络传输
状况不好(如断线过多,开的线程过多,服务器人太多导致不能连接太多等)导致下载下来的文件损坏!
(2)站点提供的的RAR压缩包本来就是损坏的(这就没办法了,除非此压缩包中含有回复记录)。
(3)所使用的
下载工具
不够完善,比如有的下载工具
多开
了几个线程后,下载的收尾工作很慢,
有些时候
下载到99%时数据就不再传输了,一定要人工操作才能结束(先停止下载接着
再开始
)。笔者就碰到过好几次这样的情况。结果是文件下载下来以后解压缩到快结束时CRC出错。
应急解决
1.利用恢复记录
想要修复CRC是有条件的,必须是此RAR压缩包中有恢复记录,而此恢复记录是RAR压缩包被压缩时的可选项。
而WinRAR压缩时默认是不放置恢复记录的,如果提供的是这样的RAR压缩包,那么用户自己想要修复CRC错误是不可能的。
2.釜底抽薪
如果RAR压缩包中的文件是那种即使文件有缺失仍能正常或较为正常地使用的(其实大多数的文件对部分数据损坏都不是非常敏感的),那便可以使出我们的终极杀招:
釜底抽薪法

其原理就是让RAR压缩包内损坏的文件解压缩出来,不理会WinRAR的警告,能解压多少就解压多少。
解压缩软件
还是用WinRAR,不过要做小小的设置。
在右键点击解压缩文件后跳出的窗口里,把“保留被损坏的文件”
复选框
选中,点击确定开始解压缩。不要理会解压缩出错的信息,解压缩结束之后你会发现损坏的文件被解压出来了。经过这样解压出来的损坏文件能正常使用的几率还是非常高的。
做好
保险工作
1.做好恢复记录
原始RAR压缩包在压缩时,如果选择放置恢复记录,这样用户下载后即使CRC出错也有自己修复的机会!
2.采取分卷压缩
采取分卷压缩的方法便可较大地减少因为出现不可恢复的错误带来的损失。
3.老文件也加恢复记录
有人也许会问,新压缩的RAR压缩包可以加入恢复记录,那么已经压缩过的RAR包有没有办法也加上恢复记录呢?给已经压缩好的RAR压缩包加上恢复纪录是有办法的。
只需要打开压缩包,在“命令”菜单中选择“保护档案文件”即可。
常识
其实RAR压缩包出错的解决方法主要是以预防为主!如果没有预防,等到真正出了问题,技术上也是没办法完美解决的!像循环冗余校验码(CRC)出错这种情况,如果RAR压缩包不包含恢复记录的话,用户自己想要修复CRC是不可能的!本文的主要目的是想告诉大家一些出错的原因以及讨论一些从根本上预防出错和把损失减少到最小的办法而已!

CRC16校验码如何计算

比如我有一个16进制只字符串
7E 00 05 60 31 32 33 要在末尾添加两个CRC16校验码 校验这7个16进制字符 请写出算法和答案

7E 00 05 60 31 32 33 计算CRC16结果应该是:5B3E

方法如下:
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0), 之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。
CRC(16位)多项式为 X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101。

参考资料:http://baike.baidu.com/view/80377.htm#2

参考技术A

首先G(X)=X3+X+1可以得出G(x)=1011[G(x)中的1就是二进制第0位为1,X就是第一位为1,没有X^2,所以第二位为0,X^3则第三位为1。所以就是1011]

M(x)=0011M(x)*x3=0011000

M(x)*x3/G(x)的余数是101所以R(X)=101

CRC码为:M(x)*x3+R(x)=0011000+010=0011010

在计算机网络通信中

运用CRC校验时相对于其他校验方法就有一定的优势。CRC可以高比例的纠正信息传输过程中的错误,可以在极短的时间内完成数据校验码的计算,并迅速完成纠错过程,通过数据包自动重发的方式使得计算机的通信速度大幅提高,对通信效率和安全提供了保障。由于CRC算法检验的检错能力极强,且检测成本较低,因此在对于编码器和电路的检测中使用较为广泛。

以上内容参考:百度百科-CRC

参考技术B CRC16区分很多种的呀,你要的是哪一种?

"7E000560313233" (hex)

1 byte checksum 121
CRC-16 0xBD48
CRC-16 (Modbus) 0xBD53
CRC-16 (Sick) 0x64A4
CRC-CCITT (XModem) 0x5B3E
CRC-CCITT (0xFFFF) 0xAAF0
CRC-CCITT (0x1D0F) 0x434C
CRC-CCITT (Kermit) 0xA572
CRC-DNP 0xC9B2
CRC-32 0xA5F4B6BB
之前wengshl回答是
CRC-CCITT (XModem) 0x5B3E
参考技术C 1335545988980,999000. 参考技术D 校验的串呢? crc要根据你的串生成一个校验串的

以上是关于CRC是校验文件与压缩问题的主要内容,如果未能解决你的问题,请参考以下文章

用S7-200的编程软件怎么写CRC校验程序?

解压文件时诊断信息说:CRC校验错误,文件被破坏。是啥意思?怎么解决?

什么是CRC校验码?

CRC校验失败怎么办?

将 CRC 值保存在文件中,而不更改实际的 CRC 校验和?

谁会crc16-ccitt的计算方法,用winform做的,谢谢啦。。。