CRC-16/KERMIT 实施
CRC-16/KERMIT Implementation
我正在使用以下函数来计算 CRC。
function crc16_kermit($string) {
$crc = 0;
for ( $x=0; $x<strlen( $string ); $x++ ) {
$crc = $crc ^ ord( $string[$x] );
for ($y = 0; $y < 8; $y++) {
if ( ($crc & 0x0001) == 0x0001 ) $crc = ( ($crc >> 1 ) ^ 0x8408 );
else $crc = $crc >> 1;
}
}
$lb = ($crc & 0xff00) >> 8;
$hb = ($crc & 0x00ff) << 8;
$crc = $hb | $lb;
return $crc;
}
但是它没有显示预期的结果。 IE;从这个函数中,我得到了十六进制值“6c20536574696f20322c31”的 CRC 作为“2DE3”。但我需要将其作为 'EB3E'。我检查了 'https://crccalc.com/' 中的值。
你的代码没问题。你的测试是错误的。您没有将 6c20...
转换为二进制。 2de3
是该 ASCII 数字和字母字符串的 CRC。如果将其转换为二进制,则会得到 eb3e
.
但请注意,出于某种原因,您例程的最后三行颠倒了字节。所以你会得到3eeb
.
我正在使用以下函数来计算 CRC。
function crc16_kermit($string) {
$crc = 0;
for ( $x=0; $x<strlen( $string ); $x++ ) {
$crc = $crc ^ ord( $string[$x] );
for ($y = 0; $y < 8; $y++) {
if ( ($crc & 0x0001) == 0x0001 ) $crc = ( ($crc >> 1 ) ^ 0x8408 );
else $crc = $crc >> 1;
}
}
$lb = ($crc & 0xff00) >> 8;
$hb = ($crc & 0x00ff) << 8;
$crc = $hb | $lb;
return $crc;
}
但是它没有显示预期的结果。 IE;从这个函数中,我得到了十六进制值“6c20536574696f20322c31”的 CRC 作为“2DE3”。但我需要将其作为 'EB3E'。我检查了 'https://crccalc.com/' 中的值。
你的代码没问题。你的测试是错误的。您没有将 6c20...
转换为二进制。 2de3
是该 ASCII 数字和字母字符串的 CRC。如果将其转换为二进制,则会得到 eb3e
.
但请注意,出于某种原因,您例程的最后三行颠倒了字节。所以你会得到3eeb
.