spiegel-keyman/common/windows/cpp/src/crc32.cpp

64 lines
1.1 KiB
C++

#include "pch.h"
#define CRC32_POLYNOMIAL 0xEDB88320
unsigned long CRCTable[256];
int TableBuilt = 0;
void BuildCRCTable()
{
int i, j;
unsigned long crc;
if(!TableBuilt)
for(i = 0; i < 256; i++)
{
crc = i;
for(j = 8; j >= 1; j--)
if((crc & 1)) crc = (crc >> 1) ^ CRC32_POLYNOMIAL; else crc >>= 1;
CRCTable[i] = crc;
}
TableBuilt = 1;
}
/*
* This routine calculates the CRC for a block of data using the
* table lookup method. It accepts an original value for the crc,
* and returns the updated value.
*/
unsigned long CalculateBufferCRC(unsigned char *p, unsigned long count)
{
unsigned long temp1, temp2, crc;
crc = 0xFFFFFFFF;
if(!TableBuilt) BuildCRCTable();
while(count > 0)
{
temp1 = (crc >> 8) & 0x00FFFFFF;
temp2 = CRCTable[((int)crc ^ (int)*p) & 0xFF];
crc = temp1 ^ temp2;
p++; count--;
}
return crc;
}
unsigned long CalculateBufferCRC(unsigned long count, unsigned char *p)
{
return CalculateBufferCRC(p, count);
}
void Dehash(unsigned char *buf, unsigned long len)
{
while(len > 0)
{
*buf = *buf ^ 0x6D;
buf++; len--;
}
}