2016-10-18 14:00:12 +00:00
|
|
|
#include "CRC.h"
|
2016-10-11 10:21:46 +00:00
|
|
|
|
2020-11-14 09:54:28 +00:00
|
|
|
#define CRC32_POLYNOMIAL 0x04C11DB7U
|
2016-10-11 10:21:46 +00:00
|
|
|
|
2020-11-14 09:54:28 +00:00
|
|
|
static unsigned int CRCTable[ 256 ];
|
2016-10-11 10:21:46 +00:00
|
|
|
|
|
|
|
static
|
2020-11-14 09:54:28 +00:00
|
|
|
u32 Reflect( u32 ref, u32 ch )
|
2016-10-11 10:21:46 +00:00
|
|
|
{
|
|
|
|
u32 value = 0;
|
|
|
|
|
|
|
|
// Swap bit 0 for bit 7
|
|
|
|
// bit 1 for bit 6, etc.
|
2020-11-14 09:54:28 +00:00
|
|
|
for (u32 i = 1; i < (ch + 1); ++i) {
|
2016-10-11 10:21:46 +00:00
|
|
|
if(ref & 1)
|
|
|
|
value |= 1 << (ch - i);
|
|
|
|
ref >>= 1;
|
|
|
|
}
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
2016-10-18 14:00:12 +00:00
|
|
|
void CRC_Init()
|
2016-10-11 10:21:46 +00:00
|
|
|
{
|
|
|
|
u32 crc;
|
|
|
|
|
2020-11-14 09:54:28 +00:00
|
|
|
for (u32 i = 0; i < 256; ++i) {
|
|
|
|
crc = Reflect( i, 8U ) << 24U;
|
2016-10-11 10:21:46 +00:00
|
|
|
for (int j = 0; j < 8; ++j)
|
2020-11-14 09:54:28 +00:00
|
|
|
crc = (crc << 1U) ^ (crc & (1U << 31U) ? CRC32_POLYNOMIAL : 0U);
|
2016-10-11 10:21:46 +00:00
|
|
|
|
2020-11-14 09:54:28 +00:00
|
|
|
CRCTable[i] = Reflect( crc, 32U );
|
2016-10-11 10:21:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-30 02:21:06 +00:00
|
|
|
u64 CRC_Calculate( u64 crc, const void * buffer, u32 count )
|
2016-10-11 10:21:46 +00:00
|
|
|
{
|
2020-03-30 02:21:06 +00:00
|
|
|
u32 crc32 = static_cast<u32>(crc);
|
|
|
|
u32 orig = crc32;
|
2016-10-11 10:21:46 +00:00
|
|
|
|
2020-11-14 09:54:28 +00:00
|
|
|
const u8 *p = reinterpret_cast<const u8*>(buffer);
|
2016-10-11 10:21:46 +00:00
|
|
|
while (count--)
|
2020-03-30 02:21:06 +00:00
|
|
|
crc32 = (crc32 >> 8) ^ CRCTable[(crc32 & 0xFF) ^ *p++];
|
2016-10-11 10:21:46 +00:00
|
|
|
|
2020-03-30 02:21:06 +00:00
|
|
|
return crc32 ^ orig;
|
2016-10-11 10:21:46 +00:00
|
|
|
}
|
|
|
|
|
2016-11-01 21:57:40 +00:00
|
|
|
u32 CRC_Calculate_Strict( u32 crc, const void * buffer, u32 count )
|
|
|
|
{
|
2020-11-14 09:54:28 +00:00
|
|
|
return static_cast<u32>(CRC_Calculate(crc, buffer, count));
|
2016-11-01 21:57:40 +00:00
|
|
|
}
|
|
|
|
|
2020-03-30 02:21:06 +00:00
|
|
|
u64 CRC_CalculatePalette(u64 crc, const void * buffer, u32 count )
|
2016-10-11 10:21:46 +00:00
|
|
|
{
|
2020-03-30 02:21:06 +00:00
|
|
|
u32 crc32 = static_cast<u32>(crc);
|
|
|
|
u32 orig = crc32;
|
2016-10-11 10:21:46 +00:00
|
|
|
|
2020-11-14 09:54:28 +00:00
|
|
|
const u8 *p = reinterpret_cast<const u8*>(buffer);
|
2016-10-11 10:21:46 +00:00
|
|
|
while (count--) {
|
2020-03-30 02:21:06 +00:00
|
|
|
crc32 = (crc32 >> 8) ^ CRCTable[(crc32 & 0xFF) ^ *p++];
|
|
|
|
crc32 = (crc32 >> 8) ^ CRCTable[(crc32 & 0xFF) ^ *p++];
|
2016-10-11 10:21:46 +00:00
|
|
|
|
|
|
|
p += 6;
|
|
|
|
}
|
|
|
|
|
2020-03-30 02:21:06 +00:00
|
|
|
return crc32 ^ orig;
|
2016-10-11 10:21:46 +00:00
|
|
|
}
|