151 lines
2.7 KiB
C
151 lines
2.7 KiB
C
![]() |
/*
|
||
|
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||
|
*/
|
||
|
|
||
|
#include "CheckSumUtils.h"
|
||
|
|
||
|
|
||
|
uint8_t UpdateCRC8(uint8_t crcIn, uint8_t byte)
|
||
|
{
|
||
|
uint8_t crc = crcIn;
|
||
|
uint8_t i;
|
||
|
|
||
|
crc ^= byte;
|
||
|
|
||
|
for (i = 0; i < 8; i++) {
|
||
|
if (crc & 0x01) {
|
||
|
crc = (crc >> 1) ^ 0x8C;
|
||
|
} else {
|
||
|
crc >>= 1;
|
||
|
}
|
||
|
}
|
||
|
return crc;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CRC8_Init( CRC8_Context *inContext )
|
||
|
{
|
||
|
inContext->crc = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CRC8_Update( CRC8_Context *inContext, const void *inSrc, size_t inLen )
|
||
|
{
|
||
|
const uint8_t *src = (const uint8_t *) inSrc;
|
||
|
const uint8_t *srcEnd = src + inLen;
|
||
|
while ( src < srcEnd ) {
|
||
|
inContext->crc = UpdateCRC8(inContext->crc, *src++);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CRC8_Final( CRC8_Context *inContext, uint8_t *outResult )
|
||
|
{
|
||
|
//inContext->crc = UpdateCRC8(inContext->crc, 0);
|
||
|
*outResult = inContext->crc & 0xffu;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*******************************************************************************/
|
||
|
|
||
|
uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte)
|
||
|
{
|
||
|
uint32_t crc = crcIn;
|
||
|
uint32_t in = byte | 0x100;
|
||
|
|
||
|
do {
|
||
|
crc <<= 1;
|
||
|
in <<= 1;
|
||
|
if (in & 0x100) {
|
||
|
++crc;
|
||
|
}
|
||
|
if (crc & 0x10000) {
|
||
|
crc ^= 0x1021;
|
||
|
}
|
||
|
} while (!(in & 0x10000));
|
||
|
return crc & 0xffffu;
|
||
|
}
|
||
|
|
||
|
void CRC16_Init( CRC16_Context *inContext )
|
||
|
{
|
||
|
inContext->crc = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CRC16_Update( CRC16_Context *inContext, const void *inSrc, size_t inLen )
|
||
|
{
|
||
|
const uint8_t *src = (const uint8_t *) inSrc;
|
||
|
const uint8_t *srcEnd = src + inLen;
|
||
|
while ( src < srcEnd ) {
|
||
|
inContext->crc = UpdateCRC16(inContext->crc, *src++);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CRC16_Final( CRC16_Context *inContext, uint16_t *outResult )
|
||
|
{
|
||
|
inContext->crc = UpdateCRC16(inContext->crc, 0);
|
||
|
inContext->crc = UpdateCRC16(inContext->crc, 0);
|
||
|
*outResult = inContext->crc & 0xffffu;
|
||
|
}
|
||
|
|
||
|
|
||
|
static unsigned int crc32_table[256];
|
||
|
|
||
|
unsigned int make_crc32_table(void)
|
||
|
{
|
||
|
static int bFlag = 0;
|
||
|
if (bFlag == 1)return(0);
|
||
|
unsigned int c;
|
||
|
int i = 0;
|
||
|
int bit = 0;
|
||
|
|
||
|
for (i = 0; i < 256; i++)
|
||
|
{
|
||
|
c = (unsigned int)i;
|
||
|
|
||
|
for (bit = 0; bit < 8; bit++)
|
||
|
{
|
||
|
if (c & 1)
|
||
|
{
|
||
|
c = (c >> 1) ^ (0xEDB88320);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
c = c >> 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
crc32_table[i] = c;
|
||
|
}
|
||
|
bFlag = 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
uint32_t crc32_ver2(uint32_t crc, const uint8_t* buf, int len)
|
||
|
{
|
||
|
while (len--)
|
||
|
{
|
||
|
crc = (crc >> 8)^(crc32_table[(crc^*buf++) & 0xff]);
|
||
|
}
|
||
|
|
||
|
return crc;
|
||
|
}
|
||
|
|
||
|
void CRC32_Init( CRC32_Context *inContext )
|
||
|
{
|
||
|
inContext->crc = 0xFFFFFFFF;
|
||
|
make_crc32_table();
|
||
|
}
|
||
|
|
||
|
void CRC32_Update( CRC32_Context *inContext, const void *inSrc, size_t inLen )
|
||
|
{
|
||
|
inContext->crc = crc32_ver2(inContext->crc, (const uint8_t*)inSrc, inLen);
|
||
|
}
|
||
|
|
||
|
void CRC32_Final( CRC32_Context *inContext, uint32_t *outResult )
|
||
|
{
|
||
|
*outResult = inContext->crc;
|
||
|
}
|
||
|
|