CRC32.java revision f7c6911047d63bc76292f55ce538da32818dd931
1f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.zip;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The CRC32 class is used to compute a CRC32 checksum from data provided as
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * input value.
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class CRC32 implements java.util.zip.Checksum {
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private long crc = 0L;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    long tbytes = 0L;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the CRC32 checksum for all input received.
32f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return The checksum for this instance.
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getValue() {
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return crc;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Resets the CRC32 checksum to it initial state.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void reset() {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        tbytes = crc = 0;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Updates this checksum with the byte value provided as integer.
4957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param val
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            represents the byte to update the checksum.
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void update(int val) {
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        crc = updateByteImpl((byte) val, crc);
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Updates this checksum with the bytes contained in buffer {@code buf}.
59f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer holding the data to update the checksum with.
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void update(byte[] buf) {
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        update(buf, 0, buf.length);
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Updates this checksum with n bytes of data obtained from buffer {@code
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * buf}, starting at offset {@code off}.
70f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer to update the checksum.
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param off
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset in {@code buf} to obtain data from.
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param nbytes
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bytes to read from {@code buf}.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void update(byte[] buf, int off, int nbytes) {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // avoid int overflow, check null buf
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (off <= buf.length && nbytes >= 0 && off >= 0
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && buf.length - off >= nbytes) {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            tbytes += nbytes;
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            crc = updateImpl(buf, off, nbytes, crc);
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native long updateImpl(byte[] buf, int off, int nbytes, long crc1);
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native long updateByteImpl(byte val, long crc1);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
93