mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
crc32 algorithm. obtained from dr dobb's journal
http://www.ddj.com/ftp/1992/1992.05/crcman.zip.
copyright 1992 mark r nelson.
(This used to be commit 73667141af
)
This commit is contained in:
parent
f8a3e2df11
commit
b960514077
70
source3/lib/crc32.c
Normal file
70
source3/lib/crc32.c
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user