この crc 16 java コードを php に変換する方法を教えてください。php を使用して変換したコードが間違っています
$str2=base64_decode($str2);
java code
public static int CRC16(final byte[] buffer) { int crc = 0xffff; for (int i = 0; i < buffer.length; i++) { crc = ((crc >>> 8) | (crc << 8)) & 0xffff; crc ^= (buffer[i] & 0xff); crc ^= ((crc & 0xff) >> 4); crc ^= (crc << 12) & 0xffff; crc ^= ((crc & 0xff) << 5) & 0xffff; } crc &= 0xffff; return crc; }
function uRShift($a, $b){ if($b == 0) return $a; return ($a >> $b) & ~(1<<(8*PHP_INT_SIZE-1)>>($b-1));} function crc16($buffer) { $crc = 0xffff; for ($i = 0; $i < strlen($buffer); $i++) { $crc = ((uRShift($crc,8)) | ($crc << 8)) & 0xffff; $crc ^= ($buffer[$i] & 0xff); $crc ^= (($crc & 0xff) >> 4); $crc ^= ($crc << 12) & 0xffff; $crc ^= (($crc & 0xff) << 5) & 0xffff; } $crc &= 0xffff; return $crc; }
java の byte[] 型、対応する php データ型はありません
内部コードのバイトは次のように取得できますbyte ord($buffer[$ i])
関数 $buffer = array_values(unpack('C', $buffer)); を入力することもできます
unpack('C', $buffer) 返される配列は添字 1 から始まります, ので、array_values 並べ替えてください
foreach ループ、または 1 から始まる for ループを使用する場合は、並べ替える必要はありません
他には何もないはずです
まだ問題があると思われる場合は、提供してくださいJava の実行結果のいくつかのセット
$str2=base64_decode($str2);
Java によって得られた結果は 8357 です
PHP によって得られた結果は 33653 です
なぜ $str2 なのか=base64_decode($str2);
Base64 エンコードは Java でも行われます。
ありがとう、完了しました