Нужна помощь в программировании CRC, преобразование CRC32 из класса.NET в C

Код (написан на C):

unsigned long chksum_crc32 (unsigned char *block, unsigned int length)
{
   register unsigned long crc;
   unsigned long i;

   crc = 0xFFFFFFFF;
   for (i = 0; i < length; i++)
   {
      crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *block++) & 0xFF];
   }
   return (crc ^ 0xFFFFFFFF);
}


/* chksum_crc32gentab() --      to a global crc_tab[256], this one will
 *              calculate the crcTable for crc32-checksums.
 *              it is generated to the polynom [..]
 */

void chksum_crc32gentab ()
{
   unsigned long crc, poly;
   int i, j;

   poly = 0xEDB88320L;
   for (i = 0; i < 256; i++)
   {
      crc = i;
      for (j = 8; j > 0; j--)
      {
         if (crc & 1)
         {
            crc = (crc >> 1) ^ poly;
         }
         else
         {
            crc >>= 1;
         }
      }
      crc_tab[i] = crc;
   }
}

Для начинающих; Я знаю, как работает CRC, сначала вычисляется делитель с указанным полиномом, затем эта последовательность проверки кадров FCS ()добавляется к набору данных и отправляется в систему конечных пользователей. После завершения передачи FCS проверяется с помощью того же полинома, который использовался для расчета FCS, и если остаток данных с этим делителем равен нулю, то вы знаете, что данные верны.

Я не понимаю реализацию этих двух функций. Из того, что я узнал, функция chksum _crc32gentab ()генерирует все возможные шестнадцатеричные значения, которые может принимать контрольная сумма с 32-битным полиномом CRC. Одного я не понимаю, как poly = 0xEDB88320L; эквивалентно многочлену. Я тоже не понимаю логики в нижней части этой функции. Например, условное выражение if (crc & 1), означает ли это, что для каждого бита в crc, равного 1, вычислить, иначе сдвинуть вправо на один бит?

я тоже не понимаю chksum _crc32 (unsigned char *block, unsigned int length ); . Эта функция просто принимает строку байтов и преобразует их в правильное значение CRC, вычисленное с помощью таблицы?. Думаю, я запутался в логике, которую он использует в цикле for.

Если кто-нибудь понимает этот код, объяснение было бы отличным; это работает для преобразования crc32 из класса.net, пример того, как данные преобразуются, а затем используются этими функциями, может быть чем-то вроде: (C #источник)

      MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(input));

            foreach (byte b in crc32.ComputeHash(ms))
                hash += b.ToString("x2").ToLower();

Вот исходный сайт и проект, из которого был взят код C.http://www.codeproject.com/Articles/35134/How-to-calculate-CRC-in-C

Любое объяснение поможет

0
задан Benjamin 23 December 2013 в 16:39
поделиться