forked from rosh/MQL5Book
66 lines
1.9 KiB
MQL5
66 lines
1.9 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| CRC32.mqh |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//| Zip, PNG, etc |
| |||
//+------------------------------------------------------------------+
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Calculate CRC32 in most simple way |
| |||
//+------------------------------------------------------------------+
| |||
class CRC32
| |||
{
| |||
private:
| |||
static uint table[256]; // bit mask per byte
| |||
| |||
static void initTable()
| |||
{
| |||
static bool tableCalculated = false;
| |||
if(tableCalculated) return;
| |||
tableCalculated = true;
| |||
| |||
const uint polynomial = 0xEDB88320;
| |||
| |||
// loop through all possible byte values
| |||
for(int i = 0; i < 256; ++i)
| |||
{
| |||
uint byte = (uint)i;
| |||
// loop through bits
| |||
for(uchar b = 0; b < 8; ++b)
| |||
{
| |||
if((byte & 1) != 0)
| |||
{
| |||
byte = polynomial ^ (byte >> 1);
| |||
}
| |||
else
| |||
{
| |||
byte = (byte >> 1);
| |||
}
| |||
}
| |||
table[i] = byte;
| |||
}
| |||
}
| |||
| |||
public:
| |||
CRC32() { initTable(); }
| |||
| |||
uint compute(uchar &bytes[], uint crc = 0xFFFFFFFF)
| |||
{
| |||
for(int i = 0; i < ArraySize(bytes); ++i)
| |||
{
| |||
uchar pos = (uchar)((crc ^ bytes[i]) & 0xFF);
| |||
crc = (uint)((crc >> 8) ^ (uint)(table[pos]));
| |||
}
| |||
| |||
return crc;
| |||
}
| |||
| |||
static uint crc32(uchar &bytes[])
| |||
{
| |||
CRC32 temp;
| |||
return temp.compute(bytes) ^ 0xFFFFFFFF;
| |||
}
| |||
};
| |||
| |||
static uint CRC32::table[256];
| |||
//+------------------------------------------------------------------+
|