Rexdf

The devil is in the Details.

Crc32的问题

| Comments

最近Adobe更新比较频繁,然后下载下来12个1G分卷的是用的Total Command的win-sfv32生成的一个sfv校验文件。因为以前好像都是MD5的校验和,所以直接用md5sum,sha1sum和type命令,直接在cmd里面就可以把问题解决(我的path里面带了cygwin的bin目录)。突然来个CRC32还真没办法。

突然想起Linux和BSD里面都带有一个cksum命令,然后发现cksum在cygwin里面也是带有的。但是问题是cksum生成的格式是:

10进制CRC32 文件大小 文件名

然后我开了个cygwin终端,用echo "obase=64;20150101"|bc来转成十六进制,自然就看到CRC32值不符合了。然后隐约觉得继续安装下去会出问题。然后解压这12个文件,得到的也是一个带sfv的iso文件,问题是rar解压过程并没有报错。继续用cksum来校验这个解压出来的15+G的iso文件,依然校验不符。然后突然记起我的一个万能工具rhash,于是用rhash.exe -C file.iso进行校验,惊奇发现和sfv是对的上的。

经过一番搜索发现,CRC32算法有很多种类,除了多项式选择的不同外,其中具体实现细节也还有很多差异。

cksum这个工具是bsd4.4里面开始出现的。它的计算结果与所有其他算法都不相同,其多项式如下

由ISO/IEC 8802-3:1989.:

然而参考这篇CRC32 Checksums; The Good, The Bad, And The Ugly之后,然后发现Unix的这个cksum还真是比较特立独行的。总之,一般它只能用来和它自己比较。

然后关于CRC的一些详细资料这里的表格。这里可以发现zlib的实现的CRC32似乎并不是CRC校验码。

python实现的常规版本的CRC32计算How to calculate the crc32 of a file in Python,以及zlib版本的CRC32计算Calculating CRC using Python zlib.crc32 function

另外附一个详细的各种CRC32计算软件JACKSUM,其中包括Java实现的cksum。

另外cksum/sum的texinfo文档和苹果系统的官方文档

一个python实现的cksum计算代码Python equivalent of unix cksum function

cksum         algorithm:   POSIX 1003.2 CRC algorithm
              length:      32 bits
              type:        crc
              since:       Jacksum 1.0.0
              comment:     - under BeOS    it is /bin/cksum
                           - under FreeBSD it is /usr/bin/cksum
                           - under HP-UX   it is /usr/bin/cksum and
                             /usr/bin/sum -p
                           - under IBM AIX it is /usr/bin/cksum
                           - under Linux   it is /usr/bin/cksum

以太网Mac帧校验的CRC32的细节Ethernet CRC32 calculation - software vs algorithmic result

另外还有ruby和perl版本的How to calculate 32 bit CRC in Ruby on rails?Calculating the crc checksum of a file using perl?,另外php版本的在CRC32 Checksums; The Good, The Bad, And The Ugly里面有说明。

Comments