2

上記のリンクに関連する可能性のある説明を拡張して提供するために、文字列データの CRC16 チェックサムを取得するための PHP の関数を次に示します。

    function crc16($data) {
        $crc = 0xAC6F;
        $len = strlen($data);
        $i = 0;
        while ($len--) {
            $crc ^= reversebyte(ord($data[$i++])) << 8;
            $crc &= 0xffff;
            for ($j = 0; $j < 8; $j++){
                $crc = ($crc & 0x8000) ? ($crc << 1) ^ 0x8005 : $crc << 1;
                $crc &= 0xffff;
            }
        }
        $crc ^= 0x0000;
        $crc = reversebits($crc);
        return $crc;
    }

    function reversebyte($byte) {
        $ob = 0;
        $b = (1 << 7);
        for ($i = 0; $i <= 7; $i++) {
            if (($byte & $b) !== 0) {
                $ob |= (1 << $i);
            }
            $b >>= 1;
        }
        return $ob;
    }

    function reversebits($cc) {
        $ob = 0;
        $b = (1 << 15);
        for ($i = 0; $i <= 15; $i++) {
            if (($cc & $b) !== 0) {
                $ob |= (1 << $i);
            }
            $b >>= 1;
        }
        return $ob;
    }

    Poly = 0x8005
    Init = 0xAC6F
    Xor = 0x0000
    Refin = True
    Refout = True

リフレクションを追加したくない場合は、関数 crc16() の次の行を置き換えます。

Refin = True に置き換えます。

    $crc ^= reversebyte(ord($data[$i++])) << 8;

Refin = False の場合:

    $crc ^= ord($data[$i++]) << 8;

Refout を置換 = True:

    $crc = reversebits($crc);

Refout = False の場合 (この行全体を削除します):

    $crc = reversebits($crc); //remove me
4

1 に答える 1

0

独自の CRC 関数を作成するには、The Painless Guide to CRC Error Detection Algorithmsを読むことをお勧めします。シンプルで単純なものや改善されたテーブル駆動型の実装など、さまざまな種類の実装の疑似コードを提供します。このガイドは、refin、refout などの要件もカバーしています。

残された唯一の困難は、疑似コードまたは C コードを php に変換することですが、phpには C とまったく同じビット単位の演算子があるため、これは実際には難しいことではありません。

于 2014-04-14T11:20:36.447 に答える