2011-01-11 02:55:51 +00:00
|
|
|
|
namespace BizHawk
|
|
|
|
|
{
|
|
|
|
|
public static class CRC32
|
|
|
|
|
{
|
|
|
|
|
// Lookup table for speed.
|
|
|
|
|
private static uint[] CRC32Table;
|
|
|
|
|
|
|
|
|
|
static CRC32()
|
|
|
|
|
{
|
2011-01-17 07:41:01 +00:00
|
|
|
|
CRC32Table = new uint[256];
|
|
|
|
|
for (uint i = 0; i < 256; ++i)
|
|
|
|
|
{
|
|
|
|
|
uint crc = i;
|
|
|
|
|
for (int j = 8; j > 0; --j)
|
2011-01-11 02:55:51 +00:00
|
|
|
|
{
|
2011-01-17 07:41:01 +00:00
|
|
|
|
if ((crc & 1) == 1)
|
|
|
|
|
crc = ((crc >> 1) ^ 0xEDB88320);
|
|
|
|
|
else
|
|
|
|
|
crc >>= 1;
|
2011-01-11 02:55:51 +00:00
|
|
|
|
}
|
2011-01-17 07:41:01 +00:00
|
|
|
|
CRC32Table[i] = crc;
|
|
|
|
|
}
|
2011-01-11 02:55:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int Calculate(byte[] data)
|
|
|
|
|
{
|
2011-01-17 07:41:01 +00:00
|
|
|
|
uint Result = 0xFFFFFFFF;
|
|
|
|
|
foreach (var b in data)
|
|
|
|
|
Result = (((Result) >> 8) ^ CRC32Table[b ^ ((Result) & 0xFF)]);
|
|
|
|
|
return (int)~Result;
|
2011-01-11 02:55:51 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|