我试图在C#中实现自己的CRC32函数。我在这里看到了一个优雅的JS解决方案:JavaScript CRC32,因此我想到了以下代码:
internal static class Crc32
{
internal static long CalculateCrc32(string str)
{
long[] crcTable = Crc32.MakeCrcTable();
long crc = 0 ^ (-1);
for (int i = 0; i < str.Length; i++)
{
char c = str[i];
crc = (crc >> 8) ^ crcTable[(crc ^ c) & 0xFF];
}
return ~crc; //(crc ^ (-1)) >> 0;
}
internal static long[] MakeCrcTable()
{
long c;
long[] crcTable = new long[256];
for (int n = 0; n < 256; n++)
{
c = n;
for (int k = 0; k < 8; k++)
{
var res = c & 1;
c = (res == 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1);
}
crcTable[n] = c;
}
return crcTable;
}
}
问题在于我的解决方案没有返回相同的结果。
Console.WriteLine(Crc32.CalculateCrc32("l"));
的结果是1762050814,而JS函数产生的结果是2517025534。JS结果也是正确的。我做错了什么?