Внедрение CRC-16 / KERMIT - PullRequest
       17

Внедрение CRC-16 / KERMIT

0 голосов
/ 09 марта 2019

Я использую следующую функцию для расчета 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; 
    }

Но результат не соответствует ожидаемому. то есть; Из этой функции я получил CRC как «2DE3» для шестнадцатеричного значения «6c20536574696f20322c31». Но мне нужно получить его как «EB3E». Я проверил значение в 'https://crccalc.com/'.

1 Ответ

0 голосов
/ 10 марта 2019

Ваш код в порядке. Ваш тест неверен. Вы не конвертировали 6c20... в двоичный файл. 2de3 - это CRC этой строки цифр и букв ASCII. Если вы конвертируете его в двоичный файл, вы получите eb3e.

Хотя обратите внимание, что по каким-то причинам последние три строки вашей процедуры обращают байты в обратном порядке. Таким образом, вы получите 3eeb.

...