Я пытаюсь использовать функцию PHP CRC16 CCITT для вычисления контрольной суммы.
Устройство отправляет мне ПАКЕТ с контрольной суммой:
10 00 00 00 00 00 00 00 12 51 09 08 00 18 00 04 02 14 00 0c 00 0c 02
1c 00 02 00 00 00 00 00 00 a0 77
Контрольная сумма находится в конце: a0 77
Я пытался использовать
Конвертировать C в PHP для функции CRC16
Безуспешно, вычисления CRC 16 возвращают: E6 F4
вместо a0 77
Я получаю верную информацию Hex, когда я ищу:
100000000000000012510908001800040214000c000c021c0002000000000000
на вебсайте http://www.lammertbies.nl/comm/info/crc-calculation.html но я не могу воспроизвести это. (не забудьте выбрать тип ввода в HEX)
Можете ли вы помочь мне выяснить, как получить crc16 CCITT строки шестнадцатеричных значений
100000000000000012510908001800040214000c000c021c0002000000000000
Я ищу контрольную сумму a0 77
Я был в состоянии произвести ту же контрольную сумму с реализацией, как показано ниже:
define('CRC16POLYN', 0x1021);
function CRC16Normal($buffer) {
$result = 0xFFFF;
if (($length = strlen($buffer)) > 0) {
for ($offset = 0; $offset < $length; $offset++) {
$result ^= (ord($buffer[$offset]) << 8);
for ($bitwise = 0; $bitwise < 8; $bitwise++) {
if (($result <<= 1) & 0x10000) $result ^= CRC16POLYN;
$result &= 0xFFFF;
}
}
}
return $result;
}
echo dechex(CRC16Normal(hex2bin('100000000000000012510908001800040214000c000c021c0002000000000000')));
Выше дает a077
на выходе.
Фрагмент кода найден на https://forums.digitalpoint.com/threads/php-define-function-calculate-crc-16-ccitt.2584389/
Из функции Депли я узнал, как она работает. Он получает байтовый массив вместо шестнадцатеричной строки для выполнения работы.
Вот код:
// $commands = [0x35, 0x02, 0x02, 0x00, 0x10, 0x03]; // => 0x5ba3
$commands = [0x44, 0x02, 0x02, 0x01, 0x10, 0x03]; // => 0x55c0
var_dump(dechex(getChecksum($commands)));
function getChecksum($byteArray) {
$polynom = 0x8408;
$in_crc = 0x0000;
for ($i = 0; $i < sizeof($byteArray); $i++) {
for ($n = 0; $n < 8; $n++) {
if((($byteArray[$i] & 0x0001) ^ $in_crc) & 0x0001)
$in_crc = ($in_crc >> 1) ^ $polynom;
else
$in_crc = $in_crc >> 1;
$byteArray[$i] = $byteArray[$i] >> 1;
}
$result = $in_crc;
}
return $result;
}
Решение может быть доказано на этот Онлайн калькулятор CRC.
Используемый алгоритм CRC-16 / KERMIT.