public class Crc32
{
public static uint ComputeChecksum(byte[] bytes)
{
uint[] table = new uint[256];
// Initialize CRC table.
for (uint i = 0; i < 256; i++)
{
uint crc = i;
for (uint j = 0; j < 8; j++)
crc = (crc & 1) != 0 ? (crc >> 1) ^ 0xEDB88320 : crc >> 1;
table[i] = crc;
}
uint crcValue = 0xffffffff;
foreach (byte b in bytes)
{
byte index = (byte)(((crcValue) & 0xff) ^ b);
crcValue = (crcValue >> 8) ^ table[index];
}
return ~crcValue; // Finalize the CRC value by inverting all the bits.
}
public static uint ComputeChecksumFromFile(string path)
{
byte[] bytes = File.ReadAllBytes(path);
return ComputeChecksum(bytes);
}
}