mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-06 00:45:32 +00:00
64 lines
1.1 KiB
C++
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--;
|
|
}
|
|
}
|