CRC-16/BUYPASS.
Вот такой метод сделал для расчета:
quint16 cPrepareMKIO::countCRC16_BUYPASS(QByteArray array)
{
quint16 crc = 0x0000;
for(int i = 0; i< array.count(); ++i)
{
crc = static_cast<quint16>(array[i] << 8) ^ crc;
for(int j = 0; j < 8; ++j)
{
crc = crc & 0x8000 ? (crc << 1) ^ CRC_16 : crc << 1;
}
}
return crc;
}
И вот такой для проверки:
bool cPrepareMKIO::checkCRC16_BUYPASS(QByteArray array)
{
quint16 crc = 0x0000;
for(int i = 0; i< array.count(); ++i)
{
crc = static_cast<quint16>(array[i] << 8) ^ crc;
for(int j = 0; j < 8; ++j)
{
crc = crc & 0x8000 ? (crc << 1) ^ CRC_16 : crc << 1;
}
}
return crc == 0 ? true : false;
}
Полином (CRC_16) = 0x8005
Я что-то не правильно написал? Так как при получении не проходит проверку. QByteArray заполняю через:
QDataStream stream(&preparedData, QIODevice::WriteOnly);
stream << header.iMessageSize
<< header.iMessageIdSubaddress
...
quint16 crc = countCRC16_BUYPASS(preparedData);
stream << crc;
Да найди уже готовое, вот например: https://m.habr.com/ru/post/428746/
не сочти за рекламу: https://github.com/KoynovStas/CRC_t
Обсуждают сегодня