151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 26c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util.zip; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 286c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniakimport java.nio.ByteBuffer; 296c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniakimport sun.nio.ch.DirectBuffer; 306c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A class that can be used to compute the CRC-32 of a data stream. 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 346c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * <p> Passing a {@code null} argument to a method in this class will cause 356c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * a {@link NullPointerException} to be thrown. 366c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Checksum 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author David Connelly 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass CRC32 implements Checksum { 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int crc; 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new CRC32 object. 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public CRC32() { 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Updates the CRC-32 checksum with the specified byte (the low 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * eight bits of the argument b). 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param b the byte to update the checksum with 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void update(int b) { 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski crc = update(crc, b); 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Updates the CRC-32 checksum with the specified array of bytes. 636c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * 646c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * @throws ArrayIndexOutOfBoundsException 656c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * if {@code off} is negative, or {@code len} is negative, 666c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * or {@code off+len} is greater than the length of the 676c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * array {@code b} 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void update(byte[] b, int off, int len) { 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (b == null) { 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (off < 0 || len < 0 || off > b.length - len) { 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new ArrayIndexOutOfBoundsException(); 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski crc = updateBytes(crc, b, off, len); 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Updates the CRC-32 checksum with the specified array of bytes. 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param b the array of bytes to update the checksum with 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void update(byte[] b) { 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski crc = updateBytes(crc, b, 0, b.length); 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 896c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * Updates the checksum with the bytes from the specified buffer. 906c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * 916c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * The checksum is updated using 926c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * buffer.{@link java.nio.Buffer#remaining() remaining()} 936c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * bytes starting at 946c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * buffer.{@link java.nio.Buffer#position() position()} 956c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * Upon return, the buffer's position will 966c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * be updated to its limit; its limit will not have been changed. 976c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * 986c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * @param buffer the ByteBuffer to update the checksum with 996c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak * @since 1.8 1006c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak */ 1016c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak public void update(ByteBuffer buffer) { 1026c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak int pos = buffer.position(); 1036c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak int limit = buffer.limit(); 1046c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak assert (pos <= limit); 1056c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak int rem = limit - pos; 1066c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak if (rem <= 0) 1076c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak return; 1086c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak if (buffer instanceof DirectBuffer) { 1096c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak crc = updateByteBuffer(crc, ((DirectBuffer)buffer).address(), pos, rem); 1106c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak } else if (buffer.hasArray()) { 1116c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak crc = updateBytes(crc, buffer.array(), pos + buffer.arrayOffset(), rem); 1126c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak } else { 1136c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak byte[] b = new byte[rem]; 1146c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak buffer.get(b); 1156c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak crc = updateBytes(crc, b, 0, b.length); 1166c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak } 1176c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak buffer.position(limit); 1186c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak } 1196c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak 1206c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak /** 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Resets CRC-32 to initial value. 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void reset() { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski crc = 0; 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns CRC-32 value. 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public long getValue() { 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (long)crc & 0xffffffffL; 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private native static int update(int crc, int b); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private native static int updateBytes(int crc, byte[] b, int off, int len); 1366c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak 1376c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak private native static int updateByteBuffer(int adler, long addr, 1386c877179523385568cb4752a5825bf76f46769e2Przemyslaw Szczepaniak int off, int len); 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 140