mirror of
https://github.com/samba-team/samba.git
synced 2024-12-31 17:18:04 +03:00
71 lines
1.4 KiB
C
71 lines
1.4 KiB
C
|
/*
|
||
|
* Dr Dobb's Journal: http://www.ddj.com/ftp/1992/1992.05/crcman.zip
|
||
|
*
|
||
|
* Copyright Mark R. Nelson 1992
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "includes.h"
|
||
|
|
||
|
#define CRC32_POLYNOMIAL 0xEDB88320L
|
||
|
|
||
|
/*****************************************************************
|
||
|
Instead of performing a straightforward calculation of the 32 bit
|
||
|
CRC using a series of logical operations, this program uses the
|
||
|
faster table lookup method. This routine is called once when the
|
||
|
program starts up to build the table which will be used later
|
||
|
when calculating the CRC values.
|
||
|
*****************************************************************/
|
||
|
|
||
|
static uint32 CRCTable[256];
|
||
|
|
||
|
void crc32_build_table(void)
|
||
|
{
|
||
|
int i;
|
||
|
int j;
|
||
|
uint32 crc;
|
||
|
|
||
|
for ( i = 0; i <= 255 ; i++ )
|
||
|
{
|
||
|
crc = i;
|
||
|
for ( j = 8 ; j > 0; j-- )
|
||
|
{
|
||
|
if ( crc & 1 )
|
||
|
{
|
||
|
crc = ( crc >> 1 ) ^ CRC32_POLYNOMIAL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
crc >>= 1;
|
||
|
}
|
||
|
}
|
||
|
CRCTable[ i ] = crc;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*****************************************************************
|
||
|
This routine calculates the CRC for a block of data using the
|
||
|
table lookup method.
|
||
|
*****************************************************************/
|
||
|
|
||
|
uint32 crc32_calc_buffer( uint32 count, uchar *buffer)
|
||
|
{
|
||
|
uchar *p;
|
||
|
uint32 crc;
|
||
|
|
||
|
p = buffer;
|
||
|
crc = 0xffffffff;
|
||
|
|
||
|
while ( count-- != 0 )
|
||
|
{
|
||
|
uint32 temp1;
|
||
|
uint32 temp2;
|
||
|
|
||
|
temp1 = ( crc >> 8 ) & 0x00FFFFFFL;
|
||
|
temp2 = CRCTable[ ( (int) crc ^ *p++ ) & 0xff ];
|
||
|
crc = temp1 ^ temp2;
|
||
|
}
|
||
|
return crc;
|
||
|
}
|
||
|
|