文件CRC32校验的问题
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;
}