上記のリンクに関連する可能性のある説明を拡張して提供するために、文字列データの 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