将PHP转换为Perl校验和

时间:2012-12-27 08:53:43

标签: php perl checksum

我试图将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中运行不佳。 请给我解决方案。 感谢。

1 个答案:

答案 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));

希望有所帮助。