// CRC32 calculation. // This software is in the public domain. // import java.math.*; /** *

Calculates the CRC32 - 32 bit Cyclical Redundancy Check *

This check is used in numerous systems to verify the integrity * of information. It's also used as a hashing function. Unlike a regular * checksum, it's sensitive to the order of the characters. * It produces a 32 bit (Java int. *

* This Java programme was translated from a C version I had written. *

This software is in the public domain. * *

* When calculating the CRC32 over a number of strings or byte arrays * the previously calculated CRC is passed to the next call. In this * way the CRC is built up over a number of items, including a mix of * strings and byte arrays. *

*

 * CRC32 crc = new CRC32();
 * int crcCalc = crc.crc32("Hello World");
 * crcCalc = crc.crc32("How are you?", crcCalc);
 * crcCalc = crc.crc32("I'm feeling really good, how about you?", crcCalc);
 * 
* The line int crcCalc = crc.crc32("Hello World"); is equivalent * to int crcCalc = crc.crc32("Hello World", -1);. * When starting a new CRC calculation the "previous crc" is set to * 0xFFFFFFFF (or -1). *

* The table only needs to be built once. You may use it to generate * many CRC's. * * * @author Michael Lecuyer * * @version 1.1 August 11, 1998 * */ public class CRC32 { int CRCTable[]; // CRC Lookup table /** * Tests CRC32. *
Eg: java CRC32 "Howdy, I'm A Cowboy" * * @param args the string used to calculate the CRC32 */ public static void main(String args[]) { if (args.length == 0) { System.out.println("Usage CRC32 [string to calculate CRC32]"); System.exit(1); } System.out.println("CRC for [" + args[0] + "] is " + new CRC32().crc32(args[0])); } private int crc; // currently calculated crc (used in conversion to byte array) /** * Constructor constructs the lookup table. * */ CRC32() { buildCRCTable(); } /** * Just build a plain old fashioned table based on good, old fashioned * values like the CRC32_POLYNOMIAL. The table is of a fixed size. */ private void buildCRCTable() { final int CRC32_POLYNOMIAL = 0xEDB88320; int i, j; int crc; CRCTable = new int[256]; for (i = 0; i <= 255; i++) { crc = i; for (j = 8; j > 0; j--) if ((crc & 1) == 1) crc = (crc >>> 1) ^ CRC32_POLYNOMIAL; else crc >>>= 1; CRCTable[i] = crc; } } /** * Convenience mithod for generating a CRC from a single String. * * @param buffer string to generate the CRC32 * * @return 32 bit CRC */ public int crc32(String buffer) { return crc32(buffer, 0xFFFFFFFF); } /** * Convenience method for generating a CRC from a byte array. * * @param buffer byte array to generate the CRC32 * * @return 32 bit CRC */ public int crc32(byte buffer[]) { return crc32(buffer, 0xFFFFFFFF); } /** * Convenience method for generating a CRC from a series of String's. * * @param buffer string to generate the CRC32 * @param crc previously generated CRC32. * * @return 32 bit CRC */ public int crc32(String buffer, int crc) { return crc32(buffer.getBytes(), crc); } /** * Convenience method for generating a CRC from a series of byte arrays. * * @param buffer byte array to generate the CRC32 * @param crc previously generated CRC32. * * @return 32 bit CRC */ public int crc32(byte buffer[], int crc) { return crc32(buffer, 0, buffer.length, crc); } /** * General CRC generation function. * * @param buffer byte array to generate the CRC32 * @param start byte start position * @param count number of byte's to include in CRC calculation * @param crc previously generated CRC32. * * @return 32 bit CRC */ public int crc32(byte buffer[], int start, int count, int lastcrc) { int temp1, temp2; int i = start; crc = lastcrc; while (count-- != 0) { temp1 = crc >>> 8; temp2 = CRCTable[(crc ^ buffer[i++]) & 0xFF]; crc = temp1 ^ temp2; } return crc; } }