Я пытался реализовать свою собственную функцию CRC32 в C#. Я видел элегантное решение в JS здесь JavaScript CRC32 Так что я пришел с этим:CRC32 in C# failed
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 также является правильным. Что я делаю не так?
Вы уверены, что вы связали подходящий вопрос? Тот, с которым вы связаны, связан с кодом символа, а не с JS CRC ... –
Можете ли вы отладить это, чтобы найти проблему? Сбросьте таблицу CRC и проверьте, соответствует ли она. Сбросьте CRC после каждого расчета и посмотрите, когда они расходятся, и т. Д. У нас даже нет вашей ссылочной реализации для сравнения с ... Также google показывает много реализаций C#, которые вы, вероятно, могли бы сравнить с вашими, чтобы найти проблему. – Chris
Одна вещь, которая сразу заставляет меня задаться вопросом, правильно ли вы используете Int64 для вычисления CRC32? Имя предполагает 32 бит, как и реализация здесь: http://sanity-free.org/12/crc32_implementation_in_csharp.html – Chris