我试图将PHP转换为Perl时遇到问题。这些代码:
<form action="" method="post">
Hex: <input type="text" name="crc"> e.g : 08 13 4B 04 03 00 01 00 11
<br>
<br>
<input type="submit" name="submit" value="submit"></form>
<?php
PHP函数
function crc($data) {
$content = explode(' ',$data) ;
$len = count($content) ;
$n = 0 ;
$crc = 0xFFFF;
while ($len > 0)
{
$crc ^= hexdec($content[$n]) ;
for ($i=0; $i<8; $i++) {
if ($crc & 1) $crc = ($crc >> 1) ^ 0x8408;
else $crc >>= 1;
}
$n++ ;
$len-- ;
}
return(~$crc);
}
如果不为空
if (!empty($_POST["submit"]))
{
echo "Input = ".$_POST["crc"].'<br>';
$crc = crc($_POST["crc"]) ;
结果
echo "<br>Result: <br>";
echo "Dec = ".$crc.'<br>' ;
echo 'Dec - hex = '.dechex($crc).'<br>' ;
echo 'Checksum = '.str_replace('ffff','',dechex($crc)).'<br>' ;
}
?>
这是关于校验和的。它在PHP上运行良好,但在perl中运行不佳。 请给我解决方案。 感谢。
答案 0 :(得分:1)
正如我在评论中已经提到的,在我看来你试图计算CRC checksums。您的代码看起来不对,我不明白为什么您不使用PHP的crc32函数。
因为您没有提供我们可以使用的方法,所以我在Perl中编写了一个小型Mojolicious Web应用程序。请注意,我使用经过充分测试的Digest::CRC模块,而不是使用半轮重新制作的DIY实现。
#!/usr/bin/env perl
use Mojolicious::Lite;
use Digest::CRC;
# CRC helper
helper crc => sub {
my ($self, $data) = @_;
my $ctx = Digest::CRC->new(type => 'crc32', poly => 0x8408);
$ctx->add($data);
return $ctx->digest;
};
# just display the form
get '/' => 'form';
# calculate the CRC
post '/crc' => sub {
my $self = shift;
# build data from hex string
(my $input = $self->param('input_hex')) =~ s/\s+//g; # ignore whitespace
my $bytes = pack 'H*', $input;
# populate data for our template
$self->stash(
input => $self->param('input_hex'),
hex => $input,
bytes => $bytes,
crc => $self->crc($bytes),
);
};
# done
app->start;
__DATA__
@@ form.html.ep
% layout 'default';
% title 'form';
<form action="<%= url_for 'crc' %>" method="post">
<p>
<label for="input_hex">Hex</label>:
<input type="text" name="input_hex" id="input_hex">
<small>(e.g : 08 13 4B 04 03 00 01 00 11)</small>
</p>
<p><input type="submit" value="calculate CRC sum!"></p>
</form>
@@ crc.html.ep
% layout 'default';
% title 'CRC';
<table>
<tr><th>Input</th> <td><%== $input %></td></tr>
<tr><th>Input (cleaned up)</th> <td><%== $hex %></td></tr>
<tr><th>Extracted data</th> <td><%== $bytes %></td></tr>
<tr><th>CRC32</th> <td><%== $crc %></td></tr>
</table>
@@ layouts/default.html.ep
<!DOCTYPE html>
<html><head><title>Solving berna maxim's problems: <%= title %></title>
<style type="text/css">th{text-align:right}</style></head><body>
%= content
</body></html>
从您的代码中我看到您想要使用特殊的CRC生成多项式(0x8408
)。如果您只想检查一些校验和而不需要特殊的生成多项式,则可以删除crc
帮助程序并使用导出的CRC函数:
use Digest::CRC 'crc32';
...
$self->stash(..., crc => crc32($bytes));
希望有所帮助。