Список разделов: Статьи по дате:
31.01.2005 | Главная > Алгоритмы > Алгоритм подсчёта контрольных сумм CRC32

Комментариев к статье: 16 шт.

Алгоритм подсчёта контрольных сумм CRC32

Данный алгоритм представляет собой подсчет контрольной суммы блока данных, используя для инициализации стандартный полином 0xEDB88320. Этот алгоритм широко применяется для подсчета контрольных сумм файлов. Исходный текст класса, обеспечивающего подсчет контрольной суммы по алгоритму CRC32 для блока данных в памяти приведен ниже. Вы можете скачать проект на Visual C++ 7, который реализует консольное приложение, применяющее алгоритм к файлам.

Работа с алгоритмом производится следующим образом. Сначала создается объект класса crc32. Затем с помощью вызова функции ProcessCRC подсчитывают контрольную сумму буфера с данными. Если все данные не поместились в один буфер, crc считают в несколько заходов, каждый раз вызывая функцию ProcessCRC для очередного блока данных. Длина блока данных указывается в байтах. После подсчета всех данных в поле m_crc32 содержится контрольная сумма.

CRC.H:
/******************************************************************************
      Файл интерфейса алгоритма CRC32 со стандартным полиномом 0xEDB88320
      Исходный текст: Двуреченский Павел Александрович
      http://www.pavel.hut1.ru
      E-mail: paveldvlip@mail.ru
      2005 год
******************************************************************************/
 
class crc32{
protected:
      unsigned table[256];
public:
      unsigned m_crc32;
      crc32();
      void ProcessCRC(void* pData, int nLen);
};

CRC.CPP:
/******************************************************************************
      Файл реализации алгоритма CRC32 со стандартным полиномом 0xEDB88320.
      Исходный текст: Двуреченский Павел Александрович
      http://www.pavel.hut1.ru
      E-mail: paveldvlip@mail.ru
      2005 год
******************************************************************************/
 
#include "crc.h"
 
crc32::crc32(){
      const unsigned CRC_POLY = 0xEDB88320;
      unsigned i, j, r;
      for (i = 0; i < 256; i++){
             for (r = i, j = 8; j; j--)
                   r = r & 1? (r >> 1) ^ CRC_POLY: r >> 1;
             table[i] = r;
      }
      m_crc32 = 0;
}
 
void crc32::ProcessCRC(void* pData, register int nLen){
      const unsigned CRC_MASK = 0xD202EF8D;
      register unsigned char* pdata = reinterpret_cast<unsigned char*>(pData);
      register unsigned crc = m_crc32;
      while (nLen--){
             crc = table[static_cast<unsigned char>(crc) ^ *pdata++] ^ crc >> 8;
             crc ^= CRC_MASK;
      }
      m_crc32 = crc;
}

Скачать проект: crc32.zip (20 Кб)

Комментариев к статье: 16 шт.


(С) Copyright 2005-2016. На данном сайте содержится авторский материал, принадлежащий Двуреченскому Павлу. Перепечатка данного материала возможна только со ссылкой на www.paveldvlip.ru и указанием имени автора.