| #include <stdint.h> |
| |
| // CRC code from http://www.hackersdelight.org/hdcodetxt/crc.c.txt |
| |
| // Reverses (reflects) bits in a 32-bit word. |
| unsigned reverse(unsigned x) { |
| x = ((x & 0x55555555) << 1) | ((x >> 1) & 0x55555555); |
| x = ((x & 0x33333333) << 2) | ((x >> 2) & 0x33333333); |
| x = ((x & 0x0F0F0F0F) << 4) | ((x >> 4) & 0x0F0F0F0F); |
| x = (x << 24) | ((x & 0xFF00) << 8) | |
| ((x >> 8) & 0xFF00) | (x >> 24); |
| return x; |
| } |
| |
| // ----------------------------- crc32a -------------------------------- |
| |
| /* This is the basic CRC algorithm with no optimizations. It follows the |
| logic circuit as closely as possible. */ |
| |
| unsigned int crc32a(uint8_t *message, unsigned int size) { |
| int i, j; |
| unsigned int byte, crc; |
| |
| i = 0; |
| crc = 0xFFFFFFFF; |
| while (i < size) { |
| byte = message[i]; // Get next byte. |
| byte = reverse(byte); // 32-bit reversal. |
| for (j = 0; j <= 7; j++) { // Do eight times. |
| if ((int)(crc ^ byte) < 0) |
| crc = (crc << 1) ^ 0x04C11DB7; |
| else crc = crc << 1; |
| byte = byte << 1; // Ready next msg bit. |
| } |
| i = i + 1; |
| } |
| return reverse(~crc); |
| } |