Help with CRC calculation

Jeff Winkelman jwinkelman at movaz.com
Mon Oct 1 16:13:50 EDT 2001


I am pulling my hair out trying to figure out why my C code calculates
my CRC correctly, and the Python code does not.  Will some friendly
person out there please show me the light?

Thanks in advance.

CRC Algorithm in C:

#define POLY 0x8048

unsigned short CRC16(char *pData, unsigned short length)
{
      unsigned char i;
      unsigned int data;
      unsigned int crc = 0xffff;

      if (length == 0)
            return (~crc);

      do
      {
            for (i=0, data=(unsigned int)0xff & *pData++;
                 i < 8; 
                 i++, data >>= 1)
            {
                  if ((crc & 0x0001) ^ (data & 0x0001))
                        crc = (crc >> 1) ^ POLY;
                  else  crc >>= 1;
            }
      } while (--length);

      crc = ~crc;
      data = crc;
      crc = (crc << 8) | ((data >> 8) & 0xff);

      return (crc);
}

Possible equivalent in Python:

def crc16(packet):
    POLY = 0x8048
    crc = 0xFFFF

    if len(packet) == 0:
        return ~crc


    for byte in packet:
        data = byte & 0xFF
        for x in range(8):
            if ((crc & 0x1) ^ (data & 0x1)):
                crc = (crc >> 1) ^ POLY
            else:
                crc = crc >> 1
            data = data >> 1

    crc = ~crc
    data = crc
    crc = (crc << 8) | ((data >> 8) & 0xFF)
    return -crc

I've tried forcing everything to longs, and writting the code in C and
calling it from Python.  The bizarre thing is that when I run the C
code stand alone, it works.  But any involvement with Python, whether
it be fully implemented in python, or called by Python, it doesn't
work.

I saw a posting from Guido that suggested casting the unsigned integer
into a long and returning it that way (to help with unsigned to signed
conversion), but it didn't work either.

Any help would be HUGELY appreciated.

Jeff



More information about the Python-list mailing list