CRC32 是一种校验和算法,用于检测消息是否未被修改。
它被广泛使用:例如,计算以太网发送包校验和。
public class CRC32
{private static readonly uint[] Crc32Table = new uint[256];static CRC32(){uint i, j;uint crc;for (i = 0; i < 256; i++){crc = i;for (j = 0; j < 8; j++){if ((crc & 1) > 0)crc = (crc >> 1) ^ 0xEDB88320;elsecrc >>= 1;}Crc32Table[i] = crc;}}public static byte[] Compute(byte[] data){return Compute(data, 0, data.Length);}public static byte[] Compute(byte[] data, int offset, int count){uint crc = ComputeUint(data, offset, count);return [(byte)((crc >> 24) & 0xff),(byte)((crc >> 16) & 0xff),(byte)((crc >> 8) & 0xff),(byte)(crc & 0xff),];}public static uint ComputeUint(byte[] data){return ComputeUint(data, 0, data.Length);}public static uint ComputeUint(byte[] data, int offset, int count){uint crc = 0xffffffff;for (var i = offset; i < offset + count; i++){crc = (crc >> 8) ^ Crc32Table[(crc ^ data[i]) & 0xff];}return crc ^ 0xffffffff;}
}