Как я могу сгенерировать контрольную сумму CRC-8 в PHP?
function crcnifull ($dato, $byte) { static $PolyFull=0x8c; for ($i=0; $i<8; $i++) { $x=$byte&1; $byte>>=1; if ($dato&1) $byte|=0x80; if ($x) $byte^=$PolyFull; $dato>>=1; } return $byte; } function crc8 (array $ar,$n=false) { if ($n===false) $n=count($ar); $crcbyte=0; for ($i=0; $i<$n; $i++) $crcbyte=crcnifull($ar[$i], $crcbyte); return $crcbyte; }
Чтобы использовать эту функцию для двоичной строки, вам нужно сначала преобразовать двоичную строку в массив. Это может быть достигнуто следующим образом:
function sbin2ar($sbin) { $ar=array(); $ll=strlen($sbin); for ($i=0; $i<$ll; $i++) $ar[]=ord(substr($sbin,$i,1)); return $ar; }
Пример использования всего:
$crc8=crc8(sbin2ar($packet));
Это должен быть CRC8?
На PHP.net существует действительно простая реализация CRC16 и собственной версии CRC32 .
Если это должен быть CRC8, я бы рекомендовал кодировать что-то из sudo-кода на странице википедии, о которой указывал Мариус.