CRC校验原理并不复杂,程序也不难写。可就是搞不懂为什么一会儿正序(高位先出)一会儿逆序(低位先出)。如果说网络传输中总是低位先到的话,那为什么不是所有的CRC算法都采用逆序呢?通用的文件CRC32校验就是采用逆序(比如WINRAR),并且初始CRC还要取0xFFFFFFFF,完了结果还要取反。害得我用正序写的校验程序结果老是跟它们不同。

private void BuildCRC32Dict(uint [] table)
        {
            //const ulong seed = 0x104C11DB7;//CRC-32算法的生成表达式
            //const ulong seed = 0x11EDC6F41;//CRC-32c算法的生成表达式
            const uint seed = 0xEDB88320;//CRC-32算法的生成表达式反转
            //const ulong mask = (ulong)1 <<32 br/>            int i,j;
            for (i = 0; i <256 ibr/>            {
                //ulong crc=(ulong)i<<32/>                uint crc = (uint)i;
                for(j=0;j<8 jbr/>                {
                    if ((crc & 1) != 0)
                        crc = (crc >> 1) ^ seed;
                    else
                        crc >>= 1;
                }
                table[i] = crc;
            }
        }
        private uint MakeCRC32(FileStream fs)
        {
            int sb;
            uint crc = 0xFFFFFFFF;
            while ((sb = fs.ReadByte()) != -1)
            {
                crc = (crc >> 8) ^ (uint)CRC32Dictionary[(crc&0xFF) ^ (byte)sb];
            }
            return ~crc;
        }