CRC32.cc

Go to the documentation of this file.
00001 /*
00002  * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By
00003  * downloading, copying, installing or using the software you agree to
00004  * this license. If you do not agree to this license, do not download,
00005  * install, copy or use the software.
00006  * 
00007  * Intel Open Source License 
00008  * 
00009  * Copyright (c) 2004 Intel Corporation. All rights reserved. 
00010  * 
00011  * Redistribution and use in source and binary forms, with or without
00012  * modification, are permitted provided that the following conditions are
00013  * met:
00014  * 
00015  *   Redistributions of source code must retain the above copyright
00016  *   notice, this list of conditions and the following disclaimer.
00017  * 
00018  *   Redistributions in binary form must reproduce the above copyright
00019  *   notice, this list of conditions and the following disclaimer in the
00020  *   documentation and/or other materials provided with the distribution.
00021  * 
00022  *   Neither the name of the Intel Corporation nor the names of its
00023  *   contributors may be used to endorse or promote products derived from
00024  *   this software without specific prior written permission.
00025  *  
00026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00027  * AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00028  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00029  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR
00030  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00031  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00032  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00033  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00034  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00035  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00036  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037  */
00038 
00039 
00040 #include "CRC32.h"
00041 
00042 /*****************************************************************/
00043 /*                                                               */
00044 /* CRC LOOKUP TABLE                                              */
00045 /* ================                                              */
00046 /* The following CRC lookup table was generated automagically    */
00047 /* by the Rocksoft^tm Model CRC Algorithm Table Generation       */
00048 /* Program V1.0 using the following model parameters:            */
00049 /*                                                               */
00050 /*    Width   : 4 bytes.                                         */
00051 /*    Poly    : 0x04C11DB7L                                      */
00052 /*    Reverse : TRUE.                                            */
00053 /*                                                               */
00054 /* For more information on the Rocksoft^tm Model CRC Algorithm,  */
00055 /* see the document titled "A Painless Guide to CRC Error        */
00056 /* Detection Algorithms" by Ross Williams                        */
00057 /* (ross@guest.adelaide.edu.au.). This document is likely to be  */
00058 /* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft".        */
00059 /*                                                               */
00060 /*****************************************************************/
00061 namespace oasys {
00062 
00063 static u_int32_t CRCINIT       = 0xFFFFFFFF;
00064 static u_int32_t CRCXOROT      = 0xFFFFFFFF;
00065 static u_int32_t CRCTABLE[256] =
00066 {
00067  0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
00068  0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
00069  0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
00070  0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
00071  0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
00072  0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
00073  0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
00074  0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
00075  0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
00076  0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
00077  0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
00078  0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
00079  0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
00080  0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
00081  0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
00082  0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
00083  0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
00084  0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
00085  0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
00086  0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
00087  0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
00088  0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
00089  0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
00090  0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
00091  0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
00092  0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
00093  0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
00094  0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
00095  0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
00096  0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
00097  0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
00098  0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
00099  0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
00100  0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
00101  0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
00102  0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
00103  0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
00104  0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
00105  0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
00106  0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
00107  0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
00108  0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
00109  0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
00110  0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
00111  0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
00112  0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
00113  0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
00114  0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
00115  0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
00116  0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
00117  0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
00118  0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
00119  0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
00120  0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
00121  0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
00122  0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
00123  0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
00124  0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
00125  0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
00126  0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
00127  0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
00128  0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
00129  0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
00130  0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL
00131 };
00132 
00133 CRC32::CRC32()
00134 {
00135     reset();
00136 }
00137 
00138 void
00139 CRC32::reset()
00140 {
00141     crc_ = CRCINIT;
00142 }
00143 
00144 void
00145 CRC32::update(
00146     const u_char* buf, 
00147     size_t        length
00148     )
00149 {
00150     /* process each byte prior to checksum field */
00151     for(size_t i = 0; i<length; i++, buf++) 
00152     {
00153         crc_ = CRCTABLE[(crc_ ^ *buf) & 0xFF] ^ (crc_ >> 8);
00154     }
00155 }
00156 
00157 CRC32::CRC_t
00158 CRC32::value()
00159 {
00160     return crc_ ^ CRCXOROT;
00161 }
00162 
00163 CRC32::CRC_t
00164 CRC32::from_bytes(u_char* buf)
00165 {
00166     CRC_t crc_val;
00167 
00168     crc_val = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
00169     return crc_val; 
00170 }
00171 
00172 }; // namespace oasys

Generated on Fri Dec 22 14:47:58 2006 for DTN Reference Implementation by  doxygen 1.5.1