13

I am trying to implement a CRC32 algorithm in C that does not use a look up table (I need to use it in a boot loader that doesn't have enough memory available to have one). Is there an available solution to this that has a public license?

tshepang
  • 12,111
  • 21
  • 91
  • 136
Oscar_Mariani
  • 728
  • 3
  • 9
  • 22

1 Answers1

37

A quick search harvested this webpage. I wasn't able to find the license for these code snippets.

The following should do the job:

// ----------------------------- crc32b --------------------------------

/* This is the basic CRC-32 calculation with some optimization but no
table lookup. The the byte reversal is avoided by shifting the crc reg
right instead of left and by using a reversed 32-bit word to represent
the polynomial.
   When compiled to Cyclops with GCC, this function executes in 8 + 72n
instructions, where n is the number of bytes in the input message. It
should be doable in 4 + 61n instructions.
   If the inner loop is strung out (approx. 5*8 = 40 instructions),
it would take about 6 + 46n instructions. */

unsigned int crc32b(unsigned char *message) {
   int i, j;
   unsigned int byte, crc, mask;

   i = 0;
   crc = 0xFFFFFFFF;
   while (message[i] != 0) {
      byte = message[i];            // Get next byte.
      crc = crc ^ byte;
      for (j = 7; j >= 0; j--) {    // Do eight times.
         mask = -(crc & 1);
         crc = (crc >> 1) ^ (0xEDB88320 & mask);
      }
      i = i + 1;
   }
   return ~crc;
}
bblincoe
  • 2,393
  • 2
  • 20
  • 34
  • The link above is no longer pointing to a valid page, so I had to go find an archived version of it: https://web.archive.org/web/20190108202303/http://www.hackersdelight.org/hdcodetxt/crc.c.txt – Michael Ansolis Jan 04 '22 at 22:50
  • Thank you @MichaelAnsolis I've updated the link above. – bblincoe Feb 23 '22 at 15:59
  • 2
    The license can be found here: https://web.archive.org/web/20190716204559/http://www.hackersdelight.org/permissions.htm – gsoros Aug 23 '22 at 09:56