Генерация контрольной суммы Adler-32 - почему используются операторы бит и вправо

Я нашел метод, который реализует алгоритм Adler32 в C#, и я хотел бы использовать его, но я не понимаю часть кода:

Может кто-нибудь объяснить мне:

1) почему битовые операторы используются при инициализации sum1 и sum2

2) почему смещается sum2?

Adler32 в вики https://en.wikipedia.org/wiki/Adler-32

Объяснение оператора &:(Бинарный оператор И копирует немного в результат, если он существует в обоих операндах)

private bool MakeForBuffer(byte[] bytesBuff, uint adlerCheckSum)
    {
        if (Object.Equals(bytesBuff, null))
        {
            checksumValue = 0;
            return false;
        }
        int nSize = bytesBuff.GetLength(0);
        if (nSize == 0)
        {
            checksumValue = 0;
            return false;
        }
        uint sum1 = adlerCheckSum & 0xFFFF; // 1) why bit operator is used?
        uint sum2 = (adlerCheckSum >> 16) & 0xFFFF; // 2) why bit operator is used? , why is it shifted?

        for (int i = 0; i < nSize; i++)
        {
            sum1 = (sum1 + bytesBuff[i]) % adlerBase;
            sum2 = (sum1 + sum2) % adlerBase;
        }
        checksumValue = (sum2 << 16) + sum1;
        return true;
    }

1 ответ

Решение

1) почему используется битовый оператор?

& 0xFFFF устанавливает два старших байта контрольной суммы в 0, так sum1 это просто младшие 16 битов контрольной суммы.

2) почему используется битовый оператор? почему он сдвинут?

adlerCheckSum >> 16 сдвигает 16 старших байтов вниз до младших 16 байтов, & 0xFFFF выполняет те же действия, что и на первом этапе, - устанавливает 16 старших бит в 0.

пример

adlerChecksum = 0x12345678

adlerChecksum & 0xFFFF = 0x00005678

adlerChecksum >> 16 = 0x????1234

(так должно быть 0x00001234 в C#, но другие языки / компиляторы "обернуть биты вокруг", и вы получите 0x56781234)

(adlerChecksum >> 16) & 0xFFFF знак равно 0x00001234 Теперь вы можете быть уверены, что это 0x1234этот шаг - всего лишь предосторожность, которая, вероятно, не нужна в C#.

adlerChecksum = 0x12345678
sum1 =          0x00005678
sum2 =          0x00001234

Эти две операции объединены просто разделить UInt32 контрольная сумма на две UInt16,


От adler32 Tag-Wiki:

Adler-32- это алгоритм быстрой контрольной суммы, используемый в zlib для проверки результатов распаковки. Он состоит из двух сумм по модулю 65521. Начнем с s1 = 1 и s2 = 0, затем для каждого байта x, s1 = s1 + x, s2 = s2 + s1. Две суммы объединяются в 32-битное значение с s1 в младших 16 битах и ​​s2 в старших 16 битах.

Другие вопросы по тегам