Народ подскажите как на php посчтитать CRC 16. Есть код на С но я не шарю как перевести на php сдвиги байт http://ru.wikipedia.org/wiki/Циклич...0_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B5_.D0.A1.D0.B8 B еще в wiki написано расчёта CRC-16 CCITT (ARC) CRC-16 Результат выполниния будет тот же или разный
Думать действительно напряжно. Если не хочешь разбираться, обратись в фриланс, там тебе помогут, за соответствующее вознаграждение, естественно.
Вот исходник на С с wiki Код (Text): unsigned short Crc16( unsigned char *pcBlock, unsigned short len ) { unsigned short crc = 0xFFFF; unsigned char i; while( len-- ) { crc ^= *pcBlock++ << 8; for( i = 0; i < 8; i++ ) crc = crc & 0x8000 ? ( crc << 1 ) ^ 0x1021 : crc << 1; } return crc; } вот что у меня получилось. Но что то не то. PHP: <? function crc16( $str){ $crc = 0xFFFF; $x=0; $len = strlen($str); while($x<$len) { $crc ^= $str[$x] << 8; for( $i = 0; $i < 8;$i++ ){ $crc = $crc & 0x8000 ? ( $crc << 1 ) ^ 0x1021 : $crc << 1; echo "$crc\n"; } $x++; } return $crc; } echo "CHECK: ".crc16(123);
Roker, ты ord() забыл, и еще забыл то, что переменная crc имеет тип "unsigned int", то есть может принимать значения от 0 до 0xffff. В php нужно обрезать ее по этой маске. Вот рабочая функция. PHP: function crc16($sStr, $aParams = array()){ //-- устанавливаем значения по умолчанию у незаданных параметров $aDefaults = array( "polynome" => 0x1021, "init" => 0xFFFF, "xor_out" => 0, ); foreach ($aDefaults as $key => $val){ if (!isset($aParams[$key])){ $aParams[$key] = $val; } } //-- инициализируем переменные $sStr .= ""; $crc = $aParams['init']; $len = strlen($sStr); $i = 0; //-- считаем while ($len--){ $crc ^= ord($sStr[$i++]) << 8; $crc &= 0xffff; for ($j = 0; $j < 8; $j++){ $crc = ($crc & 0x8000) ? ($crc << 1) ^ $aParams['polynome'] : $crc << 1; $crc &= 0xffff; } } $crc ^= $aParams['xor_out']; return $crc; }