CRC_CCITT контрольная сумма PHP - PullRequest
0 голосов
/ 12 декабря 2018

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

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

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

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

1 Ответ

0 голосов
/ 13 декабря 2018

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

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

...