CRC32.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Этот фрагмент исходного кода взят из:
    Zlib – библиотека сжатия данных общего назначения. Версия 1.1.0
    Это изменённая объектно-ориентированная версия библиотеки, полностью
    совместимая с оригинальной библиотекой.

    Copyright © 1995–2005 Jean-loup Gailly и Mark Adler
    Copyright © 2000–2011 ymnk, JCraft, Inc.
    Copyright © 2016–2017, 2019–2023 Малик Разработчик

    Эта библиотека поставляется «как есть», без каких-либо явных или
    подразумеваемых гарантий. Ни при каких обстоятельствах авторы не
    несут какой-либо ответственности в случае потери данных вследствие
    использования данной библиотеки.

    Разрешается всем использовать эту библиотеку для любых целей, в том
    числе и для коммерческих приложений, а также изменять её и
    распространять свободно при соблюдении следующих условий:

        1. Оригинал библиотеки не должен быть искажён; вы не должны
    заявлять, что именно вы написали оригинальную библиотеку. Если вы
    используете эту библиотеку в своём программном продукте, то ссылка
    на авторов библиотеки была бы желательна, но это не является
    обязательным требованием.

        2. Изменённые версии исходных текстов должны быть отчётливо
    маркированы и не должны выдаваться за оригинал библиотеки.

        3. Эти замечания не могут быть удалены либо изменены при
    каком-либо варианте распространения исходных текстов.
*/

package ru.malik.elaborarer.compression.zlib;

public final class CRC32(Checksum32, Cloneable)
{
    private static final int[] TABLE;

    static {
        int[] table = new int[0x0100];
        for(int index = 0; index < 0x0100; index++)
        {
            int value = index;
            for(int bit = 8; bit-- > 0; ) value = (value & 1) != 0 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;
            table[index] = value;
        }
        TABLE = table;
    }

    public () {  }

    public (int value): super(value) {  }

    public void update(byte[] src, int offset, int length) {
        int value = ~fldValue;
        while(length-- > 0) value = TABLE.operator []((value ^ src[offset++]) & 0xff) ^ (value >>> 8);
        fldValue = ~value;
    }

    public CRC32 clone() { return new CRC32(fldValue); }
}