[CRC] Reworked for non-standard CRC lengths

pull/763/head
jgromes 2023-05-13 16:40:01 +02:00
rodzic 8062a322c6
commit acf683b91b
1 zmienionych plików z 13 dodań i 14 usunięć

Wyświetl plik

@ -6,25 +6,24 @@ RadioLibCRC::RadioLibCRC() {
uint32_t RadioLibCRC::checksum(uint8_t* buff, size_t len) {
uint32_t crc = this->init;
for(size_t i = 0; i < len; i+=this->size/8) {
uint32_t window = 0;
for(uint8_t j = 0; j < this->size/8; j++) {
uint8_t inByte = buff[i + j];
size_t pos = 0;
for(size_t i = 0; i < 8*len; i++) {
if(i % 8 == 0) {
uint32_t in = buff[pos++];
if(this->refIn) {
inByte = Module::reflect(inByte, 8);
in = Module::reflect(in, 8);
}
window |= (inByte << ((this->size - 8) - 8*j));
crc ^= (in << (this->size - 8));
}
crc ^= window;
for(size_t k = 0; k < this->size; k++) {
if(crc & ((uint32_t)1 << (this->size - 1))) {
crc <<= (uint32_t)1;
crc ^= this->poly;
} else {
crc <<= (uint32_t)1;
}
if(crc & ((uint32_t)1 << (this->size - 1))) {
crc <<= (uint32_t)1;
crc ^= this->poly;
} else {
crc <<= (uint32_t)1;
}
}
crc ^= this->out;
if(this->refOut) {
crc = Module::reflect(crc, this->size);