[Coco] Fwd: IP packets on my coco

Dave Philipsen dave at davebiz.com
Wed Jun 8 02:59:58 EDT 2016

This is a C code snippet for CRC calculation showing a 256-entry table 
of unsigned longs (1024 bytes).  I've also read that there are ways to 
to it with a 16-entry table of 32-bit words (64 bytes) but it requires a 
little more computation that the 256-entry table.

There are also some webpages that have CRC calculators on them so if you 
are writing an algorithm you can test it.  So I don't think calculating 
the CRC is going to be all that difficult nor should it be overly CPU 


    /* Table of CRCs of all 8-bit messages. */
    unsigned long crc_table[256];
    /* Flag: has the table been computed? Initially false. */
    int crc_table_computed = 0;
    /* Make the table for a fast CRC. */
    void make_crc_table(void)
      unsigned long c;
      int n, k;
      *for (n = 0; n < 256; n++) { *c = (unsigned long) n;
        for (k = 0; k < 8; k++) {
          if (c & 1)
            c = 0xedb88320L ^ (c >> 1);
            c = c >> 1;
        crc_table[n] = c;
      crc_table_computed = 1;

    /* Update a running CRC with the bytes buf[0..len-1]--the CRC
       should be initialized to all 1's, and the transmitted value
       is the 1's complement of the final running CRC (see the
       crc() routine below). */
    unsigned long update_crc(unsigned long crc, unsigned char *buf,
                             int len)
      unsigned long c = crc;
      int n;
      if (!crc_table_computed)
      for (n = 0; n < len; n++) {
        c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
      return c;
    /* Return the CRC of the bytes buf[0..len-1]. */
    unsigned long crc(unsigned char *buf, int len)
      return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL;


On 6/8/2016 12:57 AM, Barry Nelson wrote:
>   The problem with that approach is that an 8 bit CRC requires a 256 byte lookup table or 2^8 bytes. A 32 bit CRC would need a 2^32 byte table or 4294967296 bytes, that is a 4Gb lookup table.
>> Dave Philipsen dave at davebiz.com
>> Wed Jun 8 01:27:51 EDT 2016
>> I remember from the CRC calculation in X/Ymodem that there is an easy
>> and faster way to get the CRC using lookup tables.  That's how I did it
>> with Supercomm.  I believe the CRC for the networking packets is a
>> 32-bit CRC so I don't know if lookup tables are still practical or not
>> with that size CRC.  What is amazing is that I was able to find that
>> information without the internet back then.  I just now did a few
>> cursory searches on calculating CRCs and I'm guessing that there is a
>> fairly easy method that doesn't require so much overhead.
>> Dave

More information about the Coco mailing list