public sealed class CRC
{
private static ushort [] CRC16Table = null ;
private static uint [] CRC32Table = null ;
private static void MakeCRC16Table()
{
if (CRC16Table != null ) return ;
CRC16Table = new ushort [ 256 ];
for ( ushort i = 0 ; i < 256 ; i ++ )
{
ushort vCRC = i;
for ( int j = 0 ; j < 8 ; j ++ )
if (vCRC % 2 == 0 )
vCRC = ( ushort )(vCRC >> 1 );
else vCRC = ( ushort )((vCRC >> 1 ) ^ 0x8408 );
CRC16Table[i] = vCRC;
}
}
private static void MakeCRC32Table()
{
if (CRC32Table != null ) return ;
CRC32Table = new uint [ 256 ];
for ( uint i = 0 ; i < 256 ; i ++ )
{
uint vCRC = i;
for ( int j = 0 ; j < 8 ; j ++ )
if (vCRC % 2 == 0 )
vCRC = ( uint )(vCRC >> 1 );
else vCRC = ( uint )((vCRC >> 1 ) ^ 0xEDB88320 );
CRC32Table[i] = vCRC;
}
}
public static ushort UpdateCRC16( byte AByte, ushort ASeed)
{
return ( ushort )(CRC16Table[(ASeed & 0x000000FF ) ^ AByte] ^ (ASeed >> 8 ));
}
public static uint UpdateCRC32( byte AByte, uint ASeed)
{
return ( uint )(CRC32Table[(ASeed & 0x000000FF ) ^ AByte] ^ (ASeed >> 8 ));
}
public static ushort CRC16( byte [] ABytes)
{
MakeCRC16Table();
ushort Result = 0xFFFF ;
foreach ( byte vByte in ABytes)
Result = UpdateCRC16(vByte, Result);
return ( ushort )( ~ Result);
}
public static ushort CRC16( string AString, Encoding AEncoding)
{
return CRC16(AEncoding . GetBytes(AString));
}
public static ushort CRC16( string AString)
{
return CRC16(AString, Encoding . UTF8);
}
public static uint CRC32( byte [] ABytes)
{
MakeCRC32Table();
uint Result = 0xFFFFFFFF ;
foreach ( byte vByte in ABytes)
Result = UpdateCRC32(vByte, Result);
return ( uint )( ~ Result);
}
public static uint CRC32( string AString, Encoding AEncoding)
{
return CRC32(AEncoding . GetBytes(AString));
}
public static uint CRC32( string AString)
{
return CRC32(AString, Encoding . UTF8);
}
}