2013年9月12日 星期四

C# CRC32

    public class Crc32 
    {
        uint[] table;
        public uint Checksum(byte[] bytes) 
        {
            uint crc = 0xffffffff;
            for(int i = 0; i < bytes.Length; ++i) 
            {
                byte index = (byte)(((crc) & 0xff) ^ bytes[i]);
                crc = (uint)((crc >> 8) ^ table[index]);
            }
            return ~crc;
        }

        public byte[] ChecksumBytes(byte[] bytes) 
        {
            return BitConverter.GetBytes(Checksum(bytes));
        }

        public Crc32() 
        {
            uint Q= 0x12345678;
            table = new uint[256];
            uint temp = 0;
            for(uint i = 0; i < table.Length; ++i) 
            {
                temp = i;
                for(int j = 8; j > 0; --j) 
                {
                    if((temp & 1) == 1) 
                    {
                        temp = (uint)((temp >> 1) ^ Q);
                    }
                    else 
                    {
                        temp >>= 1;
                    }
                }
                table[i] = temp;
            }
        }
    }