0

尝试将 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 中却不行。请给我解决方案。谢谢。

4

1 回答 1

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

希望有帮助。

于 2012-12-27T11:36:28.487 回答