У меня проблема с получением правильной контрольной суммы шестнадцатеричного CommandBlock, который я хочу отправить контроллеру.
Существующий код написан на Deplhi, и я не очень дружу с Deplhi, поэтому я хочу сделать это на PHP. Массив ниже — это CommandBlock с контрольной суммой (последние 2 байта), которую я не знаю, как их получить:
$commandBlock = [0x10, 0x02, 0x42, 0x01, 0x02, 0x10, 0x03, **0xa3, 0xd9**];
Единственное, что я знаю, это то, что был использован CRC_CCITT () функция.
Из функции Депли я узнал, как она работает. Он получает байтовый массив вместо шестнадцатеричной строки для выполнения работы.
Вот код:
// $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.
Других решений пока нет …