Какова важность переменной Offset в этом алгоритме? - PullRequest
0 голосов
/ 18 июня 2019

Что означает эта переменная с именем Offset в этом алгоритме? Это объявлено во втором параметре calcCrc16. Для меня это бесполезно, потому что это всегда ноль и используется в сумме.

этот алгоритм генерирует crc-16. Я пытаюсь понять этот алгоритм, потому что мне нужно создать алгоритм, который проверяет crc-16, и я хочу использовать этот код в качестве основы.

public sealed class CRC
{
    private readonly int _polynom;

    public static readonly CRC Default = new CRC(0xA001);

    public CRC(int polynom)
    {
        _polynom = polynom;
    }

    public int CalcCrc16(byte[] buffer)
    {
        return CalcCrc16(buffer, 0, buffer.Length, _polynom, 0);
    }

    public static int CalcCrc16(byte[] buffer, int offset, int bufLen, int polynom, int preset)
    {
        preset &= 0xFFFF;
        polynom &= 0xFFFF;

        var crc = preset;
        for (var i = 0; i < (bufLen + 2); i++)
        {
            var data = buffer[(i + offset) % buffer.Length] & 0xFF;
            crc ^= data;
            for (var j = 0; j < 8; j++)
            {
                if ((crc & 0x0001) != 0)
                {
                    crc = (crc >> 1) ^ polynom;
                }
                else
                {
                    crc = crc >> 1;
                }
            }
        }
        return crc & 0xFFFF;
    }
}

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Я создал простой пример, используя маленькое 4-байтовое сообщение (в 6-байтовом буфере):

using System;
namespace crc16
{
    class Program
    {
        private static ushort Crc16(byte[] bfr, int bfrlen)
        {
            ushort crc = 0;
            for (int i = 0; i < bfrlen; i++)
            {
                crc ^= bfr[i];
                for (int j = 0; j < 8; j++)
                    // assumes twos complement math
                    crc = (ushort)((crc >> 1)^((0 - (crc&1)) & 0xa001));
            }
            return crc;
        }

        static void Main(string[] args)
        {
            ushort crc;
            byte[] data = new byte[6] {0x11, 0x22, 0x33, 0x44, 0x00, 0x00};
            crc = Crc16(data, 4);           // generate crc
            data[4] = (byte)(crc & 0xff);   // append crc (lsb first)
            data[5] = (byte)(crc >> 8);
            crc = Crc16(data, 6);           // verify crc;
            Console.WriteLine("{0:X4}", crc);
            return;
        }
    }
}
0 голосов
/ 18 июня 2019

Это часть сигнатуры public метода, подходящего для расчета CRC, но не для всего вашего буфера.

Конечно, большую часть времени вы можете просто использовать простую версиюметода, и в этом случае параметр всегда равен нулю, но обычно реализации хеширования и CRC строятся с помощью подобного API, что позволяет вам вычислять CRC в виде кусков, если хотите.

...