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 チェックサムを計算しようとしているように思えます。あなたのコードは間違っているように見えますが、PHP のcrc32関数を使用しない理由がわかりません。

私たちが使用できるアプローチを提供してくれなかったので、私は小さなMojolicious Web アプリを Perl で作成しました。中途半端な車輪の再発明の DIY 実装の代わりに、十分にテストされたDigest::CRCモジュールを使用したことに注意してください。

#!/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 に答える