DiBR
обычная кошмарная
домашняя страничка
Ежекакполучится околокомпьютерное обозрение
 
  <<<  предыдущий Tech! archive #51 следующий  >>>  
   Последний выпуск       Архив       Ссылки       Полезности       humor.filtered       Фотки       О сайте   
          Это - достаточно беспорядочный архив сообщений конференций сети fidonet, которые на момент их прочтения мной показались полезными или интересными. Многие устарели, многие узкоспецифичны и малоинтересны, но может оказаться и что-то новое...
         
- __techs (2:5015/42) ----------------------------------------------- __techs -
Msg  : 51 of 1000                          Scn
From : Vova Patryshev                      2:5030/119.119  02 Jul 96  10:53:00
To   : Grisha Volkov                                       04 Jul 96  23:46:54
Subj : CRC
-------------------------------------------------------------------------------
@AREA:SU.C_CPP
Hello Grisha,

26 Jun 96 17:12, Grisha Volkov wrote to All:

GV>  ужон очень - ну оченбыстPый алгоPитм сабжа 32 bit

Я это писал так:

/**
*
*   Name        CRC32_A1 -- Return a 32 bit CRC remainder
*
*   Synopsis    unsigned long crc32_a1( unsigned long init_crc,
*                                       void *pdata,
*                                       int count );
*
*               init_crc    An initial crc value or -1L.
*               pdata       The address of the data to perform the
*                             crc on.
*               count       The number of bytes of data to perform
*                             crc calculation on.
*
*   Description This function returns a 32 bit CRC (Cyclical
*               Redundancy Check) remainder based on the
*               CCITT polynomial (inverted) 0xedb88320L.  The
*               function result value is the "remainder" after the
*               polynomial "divisor" has been divided into the
*               the data, which is viewed as a polynomial.  To use
*               another polynomial, uncomment the function
*               MAKE_TABLE32 and use its returned value in place
*               of crc32_table.
*
*               The crc is actually the remainder of a division process
*               whereby the bits in the data stream are viewed as a
*               polynomial and a prime number is used as a divisor.
*               The remainder is the error detection value. Note that
*               the operations are taken in the sense of the Galois
*               field of degree 2^16 or 2^32, that is addition and
*               subtraction are bitwise XORring (^), and division
*               here reduces to conditional subtraction.
*
*               Use this function if you want to detect transmission
*               errors that affect data integrity.  The init_crc
*               parameter allows you to perform a single crc check
*               on a large stream of data in smaller pieces by
*               using the returned value for the initial value in
*               following calls. If you are only going to calculate
*               the CRC for a single block of data, init_crc is
*               normally inverted (-1L); otherwise, it is the value
*               returned by this function for the last block in the
*               stream.
*
*               The CRC-32 detection method is Copyright (C) 1986 by
*               Gary S. Brown and used with the authors permission.
*               The CRC-32 polynomial used (inverted) is 0xedb88320.
*               The reverse method is used so that the high order
*               bits are in memory first, avoiding byte swapping.
*
*   Returns     The division remainder or CRC remainder.
*
*   Version    4.10  Copyright (c) 1992, 1995 Blaise Computing Inc.
*
*   Changes    4.10  VNP 32 bits.
*
**/

#include <asynch_1.h>

static const unsigned long crc32_table[256] = {
   0x00000000L,0x77073096L,0xee0e612cL,0x990951baL,0x076dc419L,
   0x706af48fL,0xe963a535L,0x9e6495a3L,0x0edb8832L,0x79dcb8a4L,
   0xe0d5e91eL,0x97d2d988L,0x09b64c2bL,0x7eb17cbdL,0xe7b82d07L,
   0x90bf1d91L,0x1db71064L,0x6ab020f2L,0xf3b97148L,0x84be41deL,
   0x1adad47dL,0x6ddde4ebL,0xf4d4b551L,0x83d385c7L,0x136c9856L,
   0x646ba8c0L,0xfd62f97aL,0x8a65c9ecL,0x14015c4fL,0x63066cd9L,
   0xfa0f3d63L,0x8d080df5L,0x3b6e20c8L,0x4c69105eL,0xd56041e4L,
   0xa2677172L,0x3c03e4d1L,0x4b04d447L,0xd20d85fdL,0xa50ab56bL,
   0x35b5a8faL,0x42b2986cL,0xdbbbc9d6L,0xacbcf940L,0x32d86ce3L,
   0x45df5c75L,0xdcd60dcfL,0xabd13d59L,0x26d930acL,0x51de003aL,
   0xc8d75180L,0xbfd06116L,0x21b4f4b5L,0x56b3c423L,0xcfba9599L,
   0xb8bda50fL,0x2802b89eL,0x5f058808L,0xc60cd9b2L,0xb10be924L,
   0x2f6f7c87L,0x58684c11L,0xc1611dabL,0xb6662d3dL,0x76dc4190L,
   0x01db7106L,0x98d220bcL,0xefd5102aL,0x71b18589L,0x06b6b51fL,
   0x9fbfe4a5L,0xe8b8d433L,0x7807c9a2L,0x0f00f934L,0x9609a88eL,
   0xe10e9818L,0x7f6a0dbbL,0x086d3d2dL,0x91646c97L,0xe6635c01L,
   0x6b6b51f4L,0x1c6c6162L,0x856530d8L,0xf262004eL,0x6c0695edL,
   0x1b01a57bL,0x8208f4c1L,0xf50fc457L,0x65b0d9c6L,0x12b7e950L,
   0x8bbeb8eaL,0xfcb9887cL,0x62dd1ddfL,0x15da2d49L,0x8cd37cf3L,
   0xfbd44c65L,0x4db26158L,0x3ab551ceL,0xa3bc0074L,0xd4bb30e2L,
   0x4adfa541L,0x3dd895d7L,0xa4d1c46dL,0xd3d6f4fbL,0x4369e96aL,
   0x346ed9fcL,0xad678846L,0xda60b8d0L,0x44042d73L,0x33031de5L,
   0xaa0a4c5fL,0xdd0d7cc9L,0x5005713cL,0x270241aaL,0xbe0b1010L,
   0xc90c2086L,0x5768b525L,0x206f85b3L,0xb966d409L,0xce61e49fL,
   0x5edef90eL,0x29d9c998L,0xb0d09822L,0xc7d7a8b4L,0x59b33d17L,
   0x2eb40d81L,0xb7bd5c3bL,0xc0ba6cadL,0xedb88320L,0x9abfb3b6L,
   0x03b6e20cL,0x74b1d29aL,0xead54739L,0x9dd277afL,0x04db2615L,
   0x73dc1683L,0xe3630b12L,0x94643b84L,0x0d6d6a3eL,0x7a6a5aa8L,
   0xe40ecf0bL,0x9309ff9dL,0x0a00ae27L,0x7d079eb1L,0xf00f9344L,
   0x8708a3d2L,0x1e01f268L,0x6906c2feL,0xf762575dL,0x806567cbL,
   0x196c3671L,0x6e6b06e7L,0xfed41b76L,0x89d32be0L,0x10da7a5aL,
   0x67dd4accL,0xf9b9df6fL,0x8ebeeff9L,0x17b7be43L,0x60b08ed5L,
   0xd6d6a3e8L,0xa1d1937eL,0x38d8c2c4L,0x4fdff252L,0xd1bb67f1L,
   0xa6bc5767L,0x3fb506ddL,0x48b2364bL,0xd80d2bdaL,0xaf0a1b4cL,
   0x36034af6L,0x41047a60L,0xdf60efc3L,0xa867df55L,0x316e8eefL,
   0x4669be79L,0xcb61b38cL,0xbc66831aL,0x256fd2a0L,0x5268e236L,
   0xcc0c7795L,0xbb0b4703L,0x220216b9L,0x5505262fL,0xc5ba3bbeL,
   0xb2bd0b28L,0x2bb45a92L,0x5cb36a04L,0xc2d7ffa7L,0xb5d0cf31L,
   0x2cd99e8bL,0x5bdeae1dL,0x9b64c2b0L,0xec63f226L,0x756aa39cL,
   0x026d930aL,0x9c0906a9L,0xeb0e363fL,0x72076785L,0x05005713L,
   0x95bf4a82L,0xe2b87a14L,0x7bb12baeL,0x0cb61b38L,0x92d28e9bL,
   0xe5d5be0dL,0x7cdcefb7L,0x0bdbdf21L,0x86d3d2d4L,0xf1d4e242L,
   0x68ddb3f8L,0x1fda836eL,0x81be16cdL,0xf6b9265bL,0x6fb077e1L,
   0x18b74777L,0x88085ae6L,0xff0f6a70L,0x66063bcaL,0x11010b5cL,
   0x8f659effL,0xf862ae69L,0x616bffd3L,0x166ccf45L,0xa00ae278L,
   0xd70dd2eeL,0x4e048354L,0x3903b3c2L,0xa7672661L,0xd06016f7L,
   0x4969474dL,0x3e6e77dbL,0xaed16a4aL,0xd9d65adcL,0x40df0b66L,
   0x37d83bf0L,0xa9bcae53L,0xdebb9ec5L,0x47b2cf7fL,0x30b5ffe9L,
   0xbdbdf21cL,0xcabac28aL,0x53b39330L,0x24b4a3a6L,0xbad03605L,
   0xcdd70693L,0x54de5729L,0x23d967bfL,0xb3667a2eL,0xc4614ab8L,
   0x5d681b02L,0x2a6f2b94L,0xb40bbe37L,0xc30c8ea1L,0x5a05df1bL,
   0x2d02ef8dL};


unsigned long crc32_a1 (unsigned long init_crc,
                          void _FAR* pdata,
                                 int count)
{
   unsigned char _FAR* ptr = (unsigned char _FAR*) pdata;

   while (count-- > 0)
       init_crc = (init_crc >> 8) ^
                       crc32_table[(unsigned char)init_crc ^ *ptr++];
   pdata = (void _FAR*)ptr;
   return init_crc;
}

Смотри комментарии, там зарыты детали.

Best wishes,
Vova

--- хмм... (2.42.G0214+:)
* Origin: SWAP drop, SPB, Russia (2:5030/119.119)






<<<

архив dibr

>>>'