using System;

namespace oscardata
{
    class Crc
    {
        UInt16 reg16 = 0xffff;        // Schieberegister

        UInt16 crc16_bytecalc(Byte byt)
        {
            int i;
            UInt16 polynom = 0x8408;      // Generatorpolynom

            for (i = 0; i < 8; ++i)
            {
                if ((reg16 & 1) != (byt & 1))
                    reg16 = (UInt16)((reg16 >> 1) ^ polynom);
                else
                    reg16 >>= 1;
                byt >>= 1;
            }
            return reg16;           // inverses Ergebnis, MSB zuerst
        }

        public UInt16 crc16_messagecalc(Byte[] data, int len)
        {
            int i;

            reg16 = 0xffff;                 // Initialisiere Shift-Register mit Startwert
            for (i = 0; i < len; i++)
            {
                reg16 = crc16_bytecalc(data[i]);        // Berechne fuer jeweils 8 Bit der Nachricht
            }
            return reg16;
        }
    }
}
