计算文件的CRC32校验和

3
我正在尝试计算文件的CRC32校验和,以便与Mod_zip模块一起使用。我尝试使用PHP进行计算,但不幸的是失败了,如果通过了,对于较大的文件也不会有效率。我还尝试了linux cksum命令,但它只能计算文件的CRC校验和。我发现在linux上可以使用perl来计算文件的CRC32校验和,如果可以的话,我可以使用shell_exec将输出导入到我的PHP应用程序中,如何做到这一点呢?

2
CRC32不是单一的、独特的算法。http://en.wikipedia.org/wiki/CRC32#Commonly_used_and_standardized_CRCs 该页面列出了12种不同的变体,而这还没有考虑预处理和后处理。 - Joe Z
@JoeZ - 那个页面上只列出了一个 CRC-32 - Kenosis
1
@Kenosis:有4个常见的CRC-32(带有不同的后缀字母),对于每个CRC-32,都列出了三种多项式变体(正向、反向和反向倒数)。当您将它们与大端/小端、0与1的预处理条件、反转/非反转后置条件相交叉时,就会变得混乱。我认为Digest::CRC(http://search.cpan.org/~olimaul/Digest-CRC-0.18/lib/Digest/CRC.pm)可以处理所有这些问题,但其文档不足。 - Joe Z
@Kenosis:请注意,如果您的目标是“与ZIP匹配的校验和”(或其他特定程序),那就有点更具限制性。我相信Digest :: CRC中的crc32方法将会实现这一点,因为这是人们最常要求的CRC-32。 (我刚刚被烧伤了,因为我在嵌入式世界中看到了太多的CRC实现。) - Joe Z
@JoeZ - "有4种常见的CRC-32..." OP指定了CRC32而不是它的变体。正如你所提到的,Digest::CRC可以做CRC-32。String::CRC32也可以做CRC-32。 - Kenosis
1个回答

7

你有没有看过Digest::CRC?从文档来看:“它包含了使用正确参数的CRC-CCITT、CRC-16、CRC-32和CRC-64的包装函数,以及OpenPGP ASCII编码校验和中使用的CRC。”

use strict;
use warnings;
use Digest::CRC;

my $ctx = Digest::CRC->new( type => 'crc32' );

open my $fh, '<:raw', $ARGV[0] or die $!;
$ctx->addfile(*$fh);
close $fh;

print $ctx->hexdigest, "\n";

命令行使用: perl script.pl inFile 希望这能有所帮助!

谢谢,但这个计算的是文件的CRC值而不是CRC32,CRC32是8位数字,但这个返回了10位数字。 - Naveen Gamage
@NaveenGamage - 你是在寻找十六进制摘要吗?它返回8个十六进制数字。这就是文件的CRC-32。我已经修改了代码以显示十六进制摘要。 - Kenosis
3
“0x”只是表示后面跟着一个十六进制数,它并不是校验和的一部分。正常的CRC-32校验和由8个十六进制数字组成:0x********。上面的“$ctx->hexdigest”返回这个值。 - Kenosis
是的,我现在明白了,即使是mod_zip模块也可以使用没有0x的CRC32值。谢谢你的帮助。 - Naveen Gamage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接