首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Perl的“摘要”模块计算CRC?

如何使用Perl的“摘要”模块计算CRC?
EN

Stack Overflow用户
提问于 2013-03-20 13:30:00
回答 1查看 5.2K关注 0票数 3

我需要用Perl实现CRC-32 (用自定义多项式)。我已经看到有一个叫做摘要:儿童权利委员会的模块。然而,当我将结果与在线计算器进行比较时,我没有得到相同的CRC代码。

我的多项式是"101101“(bin)或"2d”(十六进制)。

我的数据是"1e5“

在线计算器是https://ghsi.de/CRC/index.php?Polynom=101101&Message=1e5。我从计算器得到的结果是"1010“(bin)或"A”(十六进制)。

这是我使用过的Perl代码(在网上找到的)

代码语言:javascript
运行
复制
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代码有什么问题?

EN

回答 1

Stack Overflow用户

发布于 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,则可以尝试

代码语言:javascript
运行
复制
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的最后一步。

此外,如果我正确地理解了您,下面的两个方法应该给出相同的结果:

代码语言:javascript
运行
复制
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";

然而,我得到了不同的结果:

代码语言:javascript
运行
复制
a1=fef37cd4= a2=758cce0=

你能告诉我我的错误在哪里吗?

  • 正如我所说,CRC有许多说明符。这就是为什么您必须建立您所需要的CRC的完整规范,包括更多的宽度和多项式。要显式地生成一个CRC32校验和,您需要这样做
代码语言:javascript
运行
复制
my $ctx = Digest::CRC->new(width => 32, poly => 0x04c11db7, init => 0xFFFFFFFF, xorout => 0xFFFFFFFF, refin => 1, refout => 1);

这将应用0xFFFFFFFF的初始值和最终值,并将refinrefout设置为true。这逆转了处理前后的位序(reflect的缩写),也就是MSB和LSB first之间的区别。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15524984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档