Это - достаточно беспорядочный архив сообщений конференций сети 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)