CRC16 на C# неправильная контрольная сумма

224
29 июня 2017, 00:59

Итак. Есть некое устройство, на которое надо передать пакет, пример:

0x00, 0xFF, 0x3F, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x0D, где 0xF5, 0x0D

Контрольные байты, считаются по CRC16. Известно, что для этого пакета должна быть эта сумма. По какому именно алгоритму она считается не известно. Не могу написать программу, которая давала бы такой результат, в онлайн калькуляторах такой результат тоже не получается, в готовых программах для расчета CRC16 такой результат тоже не получается. Есть огрызок кода расчета. Немного доработал его. Но контрольная часть так и не получается именно такой.

byte[] Bytes6 = new byte[] { 0x00, 0xFF, 0x3F, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00};

    [StructLayout(LayoutKind.Explicit)]
    public struct crcStruct// Структура для СРС16
    {
        [FieldOffset(0)] public Byte bl;
        [FieldOffset(1)] public Byte bh;
        [FieldOffset(0)] public ushort all;
    }
    crcStruct crc16 = new crcStruct ();


    private byte[] crc_Calc(byte[] pack, int length_pack)//расчет CRC пакета
    {
        byte[] res = new byte[2];
        crc16.bh = 0xff;
        crc16.bl = 0xff;
        crc16.all = 0xffff;
        ushort[] CRCArr = new ushort[] {
          0x0,0x8005,0x800f,0xa,0x801b,0x1e,0x14,0x8011,0x8033,0x36,0x3c,
    0x8039,0x28,0x802d,0x8027,0x22,0x8063,0x66,0x6c,0x8069,0x78,
    0x807d,0x8077,0x72,0x50,0x8055,0x805f,0x5a,0x804b,0x4e,0x44,
    0x8041,0x80c3,0xc6,0xcc,0x80c9,0xd8,0x80dd,0x80d7,0xd2,0xf0,
    0x80f5,0x80ff,0xfa,0x80eb,0xee,0xe4,0x80e1,0xa0,0x80a5,0x80af,
    0xaa,0x80bb,0xbe,0xb4,0x80b1,0x8093,0x96,0x9c,0x8099,0x88,0x808d,
    0x8087,0x82,0x8183,0x186,0x18c,0x8189,0x198,0x819d,0x8197,0x192,
    0x1b0,0x81b5,0x81bf,0x1ba,0x81ab,0x1ae,0x1a4,0x81a1,0x1e0,0x81e5,
    0x81ef,0x1ea,0x81fb,0x1fe,0x1f4,0x81f1,0x81d3,0x1d6,0x1dc,0x81d9,
    0x1c8,0x81cd,0x81c7,0x1c2,0x140,0x8145,0x814f,0x14a,0x815b,0x15e,
    0x154,0x8151,0x8173,0x176,0x17c,0x8179,0x168,0x816d,0x8167,0x162,
    0x8123,0x126,0x12c,0x8129,0x138,0x813d,0x8137,0x132,0x110,0x8115,
    0x811f,0x11a,0x810b,0x10e,0x104,0x8101,0x8303,0x306,0x30c,0x8309,
    0x318,0x831d,0x8317,0x312,0x330,0x8335,0x833f,0x33a,0x832b,0x32e,
    0x324,0x8321,0x360,0x8365,0x836f,0x36a,0x837b,0x37e,0x374,0x8371,
    0x8353,0x356,0x35c,0x8359,0x348,0x834d,0x8347,0x342,0x3c0,0x83c5,
    0x83cf,0x3ca,0x83db,0x3de,0x3d4,0x83d1,0x83f3,0x3f6,0x3fc,0x83f9,
    0x3e8,0x83ed,0x83e7,0x3e2,0x83a3,0x3a6,0x3ac,0x83a9,0x3b8,0x83bd,
    0x83b7,0x3b2,0x390,0x8395,0x839f,0x39a,0x838b,0x38e,0x384,0x8381,
    0x280,0x8285,0x828f,0x28a,0x829b,0x29e,0x294,0x8291,0x82b3,0x2b6,
    0x2bc,0x82b9,0x2a8,0x82ad,0x82a7,0x2a2,0x82e3,0x2e6,0x2ec,0x82e9,
    0x2f8,0x82fd,0x82f7,0x2f2,0x2d0,0x82d5,0x82df,0x2da,0x82cb,0x2ce,
    0x2c4,0x82c1,0x8243,0x246,0x24c,0x8249,0x258,0x825d,0x8257,0x252,
    0x270,0x8275,0x827f,0x27a,0x826b,0x26e,0x264,0x8261,0x220,0x8225,
    0x822f,0x22a,0x823b,0x23e,0x234,0x8231,0x8213,0x216,0x21c,0x8219,
    0x208,0x820d,0x8207,0x202}; //таблица CRC
        byte shiftVAR;

        for (int cnt = 0; cnt <= length_pack - 3; cnt++)
        {
            shiftVAR = crc16.bh;
            crc16.bh = crc16.bl;
            crc16.bl = pack[cnt];
            if (cnt >= 2) crc16.all ^= CRCArr[shiftVAR];
        }
        shiftVAR = crc16.bh;
        crc16.bh = crc16.bl;
        crc16.bl = 0;
        crc16.all ^= CRCArr[shiftVAR];
        shiftVAR = crc16.bh;
        crc16.bh = crc16.bl;
        crc16.bl = 0;
        crc16.all ^= CRCArr[shiftVAR];
        res[0] = crc16.bh;
        res[1] = crc16.bl;
        return res;

Функцию вызываю, например, так:

textBox1.AppendText(Convert.ToString(crc_Calc(Bytes6, Bytes6.Length)[0], 16));
textBox1.AppendText(Convert.ToString(crc_Calc(Bytes6, Bytes6.Length)[1], 16));
READ ALSO
Документация проектов C# на нескольких языках в VisualStudio

Документация проектов C# на нескольких языках в VisualStudio

Всем привет! Совсем недавно у меня возникла задача задокументировать весь код в проекте, чтобы при использовании метода, интеллисенс студии...

285
Вызов асинхронной функции по таймеру в C#

Вызов асинхронной функции по таймеру в C#

Можно ли как-нибудь вызвать по таймеру асинхронную функцию в C#? У обычного SystemThreading

372
Разработка приложения для Android с C# [требует правки]

Разработка приложения для Android с C# [требует правки]

Читал, что есть Monodroid и Monotouch - фреймворки от XamarinИнформации маловато, оф

160
Оптимизация UI элементов

Оптимизация UI элементов

У меня есть View Model в которой содержится состояние объекта :

198