| 1 | /* Not copyrighted 1990 Mark Adler */
|
|---|
| 2 |
|
|---|
| 3 | #ifndef lint
|
|---|
| 4 | static char rcsid[] = "$Id: makecrc.c,v 0.6 1993/05/28 07:42:59 jloup Exp $";
|
|---|
| 5 | #endif
|
|---|
| 6 |
|
|---|
| 7 | #include <stdio.h>
|
|---|
| 8 |
|
|---|
| 9 | main()
|
|---|
| 10 | /*
|
|---|
| 11 | Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
|
|---|
| 12 | 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.
|
|---|
| 13 |
|
|---|
| 14 | Polynomials over GF(2) are represented in binary, one bit per coefficient,
|
|---|
| 15 | with the lowest powers in the most significant bit. Then adding polynomials
|
|---|
| 16 | is just exclusive-or, and multiplying a polynomial by x is a right shift by
|
|---|
| 17 | one. If we call the above polynomial p, and represent a byte as the
|
|---|
| 18 | polynomial q, also with the lowest power in the most significant bit (so the
|
|---|
| 19 | byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
|
|---|
| 20 | where a mod b means the remainder after dividing a by b.
|
|---|
| 21 |
|
|---|
| 22 | This calculation is done using the shift-register method of multiplying and
|
|---|
| 23 | taking the remainder. The register is initialized to zero, and for each
|
|---|
| 24 | incoming bit, x^32 is added mod p to the register if the bit is a one (where
|
|---|
| 25 | x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
|
|---|
| 26 | x (which is shifting right by one and adding x^32 mod p if the bit shifted
|
|---|
| 27 | out is a one). We start with the highest power (least significant bit) of
|
|---|
| 28 | q and repeat for all eight bits of q.
|
|---|
| 29 |
|
|---|
| 30 | The table is simply the CRC of all possible eight bit values. This is all
|
|---|
| 31 | the information needed to generate CRC's on data a byte at a time for all
|
|---|
| 32 | combinations of CRC register values and incoming bytes. The table is
|
|---|
| 33 | written to stdout as 256 long hexadecimal values in C language format.
|
|---|
| 34 | */
|
|---|
| 35 | {
|
|---|
| 36 | unsigned long c; /* crc shift register */
|
|---|
| 37 | unsigned long e; /* polynomial exclusive-or pattern */
|
|---|
| 38 | int i; /* counter for all possible eight bit values */
|
|---|
| 39 | int k; /* byte being shifted into crc apparatus */
|
|---|
| 40 |
|
|---|
| 41 | /* terms of polynomial defining this crc (except x^32): */
|
|---|
| 42 | static int p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
|---|
| 43 |
|
|---|
| 44 | /* Make exclusive-or pattern from polynomial (0xedb88320) */
|
|---|
| 45 | e = 0;
|
|---|
| 46 | for (i = 0; i < sizeof(p)/sizeof(int); i++)
|
|---|
| 47 | e |= 1L << (31 - p[i]);
|
|---|
| 48 |
|
|---|
| 49 | /* Compute and print table of CRC's, five per line */
|
|---|
| 50 | printf(" 0x00000000L");
|
|---|
| 51 | for (i = 1; i < 256; i++)
|
|---|
| 52 | {
|
|---|
| 53 | c = i;
|
|---|
| 54 | /* The idea to initialize the register with the byte instead of
|
|---|
| 55 | * zero was stolen from Haruhiko Okumura's ar002
|
|---|
| 56 | */
|
|---|
| 57 | for (k = 8; k; k--)
|
|---|
| 58 | c = c & 1 ? (c >> 1) ^ e : c >> 1;
|
|---|
| 59 | printf(i % 5 ? ", 0x%08lxL" : ",\n 0x%08lxL", c);
|
|---|
| 60 | }
|
|---|
| 61 | putchar('\n');
|
|---|
| 62 | return 0;
|
|---|
| 63 | }
|
|---|