hex — переполнение стека контрольной суммы CRC_CCITT

У меня проблема с получением правильной контрольной суммы шестнадцатеричного CommandBlock, который я хочу отправить контроллеру.

Существующий код написан на Deplhi, и я не очень дружу с Deplhi, поэтому я хочу сделать это на PHP. Массив ниже — это CommandBlock с контрольной суммой (последние 2 байта), которую я не знаю, как их получить:

$commandBlock = [0x10, 0x02, 0x42, 0x01, 0x02, 0x10, 0x03, **0xa3, 0xd9**];

Единственное, что я знаю, это то, что был использован CRC_CCITT () функция.

1

Решение

Из функции Депли я узнал, как она работает. Он получает байтовый массив вместо шестнадцатеричной строки для выполнения работы.
Вот код:

// $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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]