lib/crc32.c

説明を見る。
00001 /*-
00002  *  COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
00003  *  code or tables extracted from it, as desired without restriction.
00004  *
00005  *  First, the polynomial itself and its table of feedback terms.  The
00006  *  polynomial is
00007  *  X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
00008  *
00009  *  Note that we take it "backwards" and put the highest-order term in
00010  *  the lowest-order bit.  The X^32 term is "implied"; the LSB is the
00011  *  X^31 term, etc.  The X^0 term (usually shown as "+1") results in
00012  *  the MSB being 1
00013  *
00014  *  Note that the usual hardware shift register implementation, which
00015  *  is what we're using (we're merely optimizing it by doing eight-bit
00016  *  chunks at a time) shifts bits into the lowest-order term.  In our
00017  *  implementation, that means shifting towards the right.  Why do we
00018  *  do it this way?  Because the calculated CRC must be transmitted in
00019  *  order from highest-order term to lowest-order term.  UARTs transmit
00020  *  characters in order from LSB to MSB.  By storing the CRC this way
00021  *  we hand it to the UART in the order low-byte to high-byte; the UART
00022  *  sends each low-bit to hight-bit; and the result is transmission bit
00023  *  by bit from highest- to lowest-order term without requiring any bit
00024  *  shuffling on our part.  Reception works similarly
00025  *
00026  *  The feedback terms table consists of 256, 32-bit entries.  Notes
00027  *
00028  *      The table can be generated at runtime if desired; code to do so
00029  *      is shown later.  It might not be obvious, but the feedback
00030  *      terms simply represent the results of eight shift/xor opera
00031  *      tions for all combinations of data and CRC register values
00032  *
00033  *      The values must be right-shifted by eight bits by the "updcrc
00034  *      logic; the shift must be unsigned (bring in zeroes).  On some
00035  *      hardware you could probably optimize the shift in assembler by
00036  *      using byte-swap instructions
00037  *      polynomial $edb88320
00038  *
00039  *
00040  * CRC32 code derived from work by Gary S. Brown.
00041  */
00042 
00043 #include "includes.h"
00044 
00045 static const uint32 crc32_tab[] = {
00046         0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
00047         0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
00048         0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
00049         0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
00050         0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
00051         0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
00052         0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
00053         0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
00054         0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
00055         0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
00056         0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
00057         0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
00058         0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
00059         0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
00060         0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
00061         0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
00062         0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
00063         0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
00064         0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
00065         0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
00066         0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
00067         0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
00068         0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
00069         0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
00070         0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
00071         0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
00072         0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
00073         0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
00074         0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
00075         0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
00076         0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
00077         0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
00078         0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
00079         0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
00080         0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
00081         0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
00082         0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
00083         0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
00084         0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
00085         0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
00086         0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
00087         0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
00088         0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
00089 };
00090 
00091 uint32 crc32_calc_buffer(const char *buf, size_t size)
00092 {
00093         const unsigned char *p;
00094         uint32 crc;
00095 
00096         p = (const unsigned char *)buf;
00097         crc = ~0U;
00098 
00099         while (size--)
00100                 crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
00101 
00102         return crc ^ ~0U;
00103 }

Sambaに対してSat Aug 29 21:22:58 2009に生成されました。  doxygen 1.4.7