Меркурий 119Ф Как вычисляется CRC?

Модели:
Меркурий-115Ф, Меркурий-119Ф, Меркурий-130Ф, Меркурий-180Ф, Меркурий-185Ф, Меркурий-МФ...
Ответить
Аватара пользователя
aleksA
Сообщения: 3
Зарегистрирован: 17 май 2017, 08:59

Меркурий 119Ф Как вычисляется CRC?

Сообщение aleksA »

Добрый день. Раньше программировал только для Атолов.
Подскажите пожалуйста как вычислить CRC для команды. Никак не могу понять что означает следующее:
"CRC16-CCITT
полином 0x1021.
Рассчитывается по
полям сообщения
2-4"

Если не трудно покажите пожалуйста пример команды для «Информация о версии ПО ККТ», код сообщения 45H.
Спасибо.
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Меркурий 119Ф Как вычисляется CRC?

Сообщение slan »

Вот так вычисляю я:

Код: Выделить всё

unsigned short Crc16Ccitt1021(unsigned char *pcBlock, unsigned short len){
        unsigned short crc = 0xFFFF;
        unsigned char i;

        while( len-- )
        {
            crc ^= *pcBlock++ << 8;

            for( i = 0; i < 8; i++ )
                crc = crc & 0x8000 ? ( crc << 1 ) ^ 0x1021 : crc << 1;
        }
        return crc;
    }
Аватара пользователя
aleksA
Сообщения: 3
Зарегистрирован: 17 май 2017, 08:59

Re: Меркурий 119Ф Как вычисляется CRC?

Сообщение aleksA »

Похоже я понял. Спасибо большое
Аватара пользователя
knaiv
Сообщения: 1
Зарегистрирован: 07 июн 2017, 18:04

Re: Меркурий 119Ф Как вычисляется CRC?

Сообщение knaiv »

Код: Выделить всё

ushort crc = 0xFFFF;
            ushort polynomial = 0x1021;

            byte[] bytes = data.ToArray();

            foreach (var b in bytes)
            {
                for (int i = 0; i < 8; i++)
                {
                    bool bit = ((b >> (7 - i) & 1) == 1);
                    bool c15 = ((crc >> 15 & 1) == 1);
                    crc <<= 1;
                    if (c15 ^ bit) crc ^= polynomial;
                }
                crc &= 0xffff;
            }
Ответить