mirror of
https://github.com/PredatH0r/ChanSort.git
synced 2026-01-14 03:12:04 +01:00
63 lines
1.3 KiB
C#
63 lines
1.3 KiB
C#
namespace ChanSort.Api
|
|
{
|
|
public static class Crc32
|
|
{
|
|
private const uint CrcMask = 0xFFFFFFFF;
|
|
private const uint CrcPoly = 0xEDB88320;
|
|
|
|
private static readonly uint[] crc32Table;
|
|
|
|
static Crc32()
|
|
{
|
|
crc32Table = InitCrc32Table();
|
|
}
|
|
|
|
#region InitCrc32Table()
|
|
|
|
private static uint[] InitCrc32Table()
|
|
{
|
|
var crcTable = new uint[256];
|
|
for (uint i = 0; i < 256; i++)
|
|
{
|
|
uint r = i;
|
|
for (uint j = 8; j > 0; j--)
|
|
{
|
|
if ((r & 1) == 1)
|
|
r = ((r >> 1) ^ CrcPoly);
|
|
else
|
|
r >>= 1;
|
|
}
|
|
crcTable[i] = r;
|
|
}
|
|
return crcTable;
|
|
}
|
|
#endregion
|
|
|
|
#region CalcCrc32()
|
|
public static uint CalcCrc32(byte[] block, int start, int length)
|
|
{
|
|
uint crc32 = CrcMask;
|
|
for (int i = 0; i < length; i++)
|
|
crc32 = crc32Table[(crc32 & 0xff) ^ block[start + i]] ^ (crc32 >> 8);
|
|
return crc32;
|
|
}
|
|
#endregion
|
|
|
|
#region Crack()
|
|
#if false
|
|
public static unsafe int Crack(byte* block, int maxLen, uint checksum)
|
|
{
|
|
uint crc32 = CrcMask;
|
|
for (int i = 0; i < maxLen; i++)
|
|
{
|
|
if (crc32 == checksum)
|
|
return i;
|
|
crc32 = crc32Table[(crc32 & 0xff) ^ block[i]] ^ (crc32 >> 8);
|
|
}
|
|
return 0;
|
|
}
|
|
#endif
|
|
#endregion
|
|
}
|
|
}
|