views:

27

answers:

0

Hello All,

The below code sample is an implementation of CRC-CCITT that I'm using in one of my projects.

public static unsafe ushort CRC(byte * it, byte * end)
            {
                unchecked
                {
                    ushort crc = 0xFFFF;
                    ushort quick = 0;

                for (;;)
                {
                    ushort tmp = (ushort)((crc >> 8) ^ (*it));
                    crc <<= 8;

                    quick = (ushort)(tmp ^ (tmp >> 4));
                    crc ^= quick;

                    quick <<= 5;
                    crc ^= quick;

                    quick <<= 7;
                    crc ^= quick;

                    if (it == end)
                        break;
                    it++;
                }
                return crc;
            }
        }

The CRC-CCITT uses the following polynominal formula :

 (X^16 + X^12 + X^5 + 1)

Q: The above polynominal is nothing more then a series of add/multiplication operations. The basic laws of mathematics state that add/multiply ops are interchangeable etc. so expressions like :

SUM(from 1 to 10) == SUM(from 1 to 5) + SUM(from 6 to 10) are true.

I need to optimize the above code, it is probably the most frequently called thing in my project, (120 times/sec at least). Having considered the above, would this be doable with a CRC checksum ? I'm considering using Parallel.For(...) to do the trick, does that even make sense? Anyone have any suggestions?

Update :

120 times per connection actually. I'm handling at least 15 simultaneous incoming connections with datarates of 120[Hz] etc. Byte arrays can vary - theoretical max = 65k bytes, but that's rarely the case, most often it's circa 1k bytes.

related questions