我需要用Perl实现CRC-32 (用自定义多项式)。我已经看到有一个叫做摘要:儿童权利委员会的模块。然而,当我将结果与在线计算器进行比较时,我没有得到相同的CRC代码。
我的多项式是"101101“(bin)或"2d”(十六进制)。
我的数据是"1e5“
在线计算器是https://ghsi.de/CRC/index.php?Polynom=101101&Message=1e5。我从计算器得到的结果是"1010“(bin)或"A”(十六进制)。
这是我使用过的Perl代码(在网上找到的)
use strict;
use warnings;
use Digest::CRC;
my $string = 0x01e5;
my $ctx = Digest::CRC->new(type => "crc32", poly => 0x2D);
$ctx->add($string);
print "CRC for '$string' is 0x" . $ctx->hexdigest . "\n";
这是这个Perl代码的输出:
“485”的CRC为0x9d0fer86。
我很确定在线计算器是正确的。
我的Perl代码有什么问题?
发布于 2013-03-20 15:30:58
正如它所说的,您的程序是计算字符串485
(字节34 38 35
)的CRC,这是数字0x1E5
的十进制字符串表示。同时,网站正在计算字节01 e5
的CRC。我不知道哪一个,如果你想要的话。
绝对正确的是,网站没有计算任何类型的CRC32,因为它的结果没有32位长,并且似乎取决于您指定的多项式的大小。
另外,如果使用Digest::CRC
指定type => 'crc32'
,它将忽略所有其他参数,而只计算一个标准的CRC32。
如果您想要一个多项式为0x2D的32位CRC,则可以尝试
my $ctx = Digest::CRC->new(width => 32, poly => 0x2D);
但是,您还需要定义一些其他东西来指定CRC,包括(但不限于)位和字节顺序、初始值和end xor值,而且在没有看到完整规范的情况下,无法判断这是否会给出正确的校验和。
当然,你有一份文件,上面写的不仅仅是"CRC32,多项式0x2d“。
更新
如何使用
Digest::CRC
将数据视为十六进制字节而不是字符串?
Digest::CRC
只处理字符串,您需要以这种方式打包数据。在这种情况下,您可能需要my $string = "\x01\xe5"
此外,"end xor值“是什么?
end xor
值只是一个位模式,即XORed,其结果是获得最终CRC的最后一步。此外,如果我正确地理解了您,下面的两个方法应该给出相同的结果:
my $ctx1 = Digest::CRC->new(type => "crc32");
my $rr1 = $ctx1->add(pack 'H*', '1e5')->hexdigest;
print "a1=$rr1=\n";
my $ctx2 = Digest::CRC->new(width => 32, poly => 0x04c11db7);
my $rr2 = $ctx2->add(pack 'H*', '1e5')->hexdigest;
print "a2=$rr2=\n";
然而,我得到了不同的结果:
a1=fef37cd4= a2=758cce0=
你能告诉我我的错误在哪里吗?
my $ctx = Digest::CRC->new(width => 32, poly => 0x04c11db7, init => 0xFFFFFFFF, xorout => 0xFFFFFFFF, refin => 1, refout => 1);
这将应用0xFFFFFFFF
的初始值和最终值,并将refin
和refout
设置为true。这逆转了处理前后的位序(reflect的缩写),也就是MSB和LSB first之间的区别。
https://stackoverflow.com/questions/15524984
复制相似问题