kopia lustrzana https://github.com/SP8EBC/ParaTNC
97 wiersze
1.8 KiB
C
97 wiersze
1.8 KiB
C
/*
|
|
* crc_.c
|
|
*
|
|
* Created on: Aug 28, 2022
|
|
* Author: mateusz
|
|
*/
|
|
|
|
|
|
#include "crc_.h"
|
|
|
|
uint8_t reflect8(uint8_t val)
|
|
{
|
|
uint8_t resVal = 0;
|
|
|
|
for(int i = 0; i < 8; i++)
|
|
{
|
|
if ((val & (1 << i)) != 0)
|
|
{
|
|
resVal |= (uint8_t )(1 << (7 - i));
|
|
}
|
|
}
|
|
|
|
return resVal;
|
|
}
|
|
|
|
uint32_t reflect32(uint32_t val)
|
|
{
|
|
uint32_t resVal = 0;
|
|
|
|
for(int i = 0; i < 32; i++)
|
|
{
|
|
if ((val & (1 << i)) != 0)
|
|
{
|
|
resVal |= (uint32_t )(1 << (31 - i));
|
|
}
|
|
}
|
|
|
|
return resVal;
|
|
}
|
|
|
|
uint32_t calcCRC32stm(void *data, uint32_t len,
|
|
uint32_t poly, uint32_t seed, uint32_t initCRC, uint32_t inR, uint32_t outR)
|
|
{
|
|
const uint8_t *buffer = (const uint8_t*) data;
|
|
uint32_t crc = seed;
|
|
uint8_t byte;
|
|
|
|
while( len-- )
|
|
{
|
|
byte = *buffer++;
|
|
if(inR) {
|
|
byte = reflect8(byte);
|
|
}
|
|
crc = crc ^ (byte << 24);
|
|
for( int bit = 0; bit < 8; bit++ )
|
|
{
|
|
if( crc & (1L << 31)) crc = (crc << 1) ^ poly;
|
|
else crc = (crc << 1);
|
|
}
|
|
}
|
|
if(outR) {
|
|
crc = reflect32(crc);
|
|
}
|
|
if(initCRC == 1) crc = ~crc;
|
|
return crc;
|
|
}
|
|
|
|
uint32_t calcCRC32std(void *data, uint32_t len,
|
|
uint32_t poly, uint32_t seed, uint32_t initCRC, uint32_t inR, uint32_t outR)
|
|
{
|
|
uint32_t crc;
|
|
uint8_t* current = (uint8_t*) data;
|
|
uint8_t byte;
|
|
|
|
crc = seed;
|
|
|
|
while (len--) {
|
|
byte = *current++;
|
|
if(inR) {
|
|
byte = reflect8(byte);
|
|
}
|
|
crc ^= byte;
|
|
for (unsigned int j = 0; j < 8; j++) {
|
|
if (crc & 1)
|
|
crc = (crc >> 1) ^ poly;
|
|
else
|
|
crc = crc >> 1;
|
|
}
|
|
|
|
}
|
|
if(outR) {
|
|
crc = reflect32(crc);
|
|
}
|
|
if(initCRC == 1) crc = ~crc;
|
|
return crc;
|
|
}
|