GY-63_MS5611/libraries/Fletcher/extras/Fletcher_compare_implementations/basic.h
2022-09-13 16:31:43 +02:00

47 lines
1.3 KiB
C

#pragma once
/*
Author: Daniel Mohr
Date: 2022-09-13
Here are basic implementations which should give reference values.
*/
uint16_t basic_fletcher16(uint8_t *data, const size_t length)
{
uint8_t s1 = 0;
uint8_t s2 = 0;
for (size_t i = 0; i < length; i++)
{
// UINT8_MAX = 255 = ((((uint16_t) 1) << 8) - ((uint16_t) 1))
s1 = (uint8_t) (((uint16_t) s1 + (uint16_t) data[i]) % UINT8_MAX);
s2 = (uint8_t) (((uint16_t) s2 + (uint16_t) s1) % UINT8_MAX);
}
return (((uint16_t) s2) << 8) | ((uint16_t) s1);
}
uint32_t basic_fletcher32(uint16_t *data, const size_t length)
{
uint16_t s1 = 0;
uint16_t s2 = 0;
for (size_t i = 0; i < length; i++)
{
// UINT16_MAX = 65535UL = ((((uint32_t) 1) << 16) - ((uint32_t) 1))
s1 = (uint16_t) (((uint32_t) s1 + (uint32_t) data[i]) % UINT16_MAX);
s2 = (uint16_t) (((uint32_t) s2 + (uint32_t) s1) % UINT16_MAX);
}
return (((uint32_t) s2) << 16) | ((uint32_t) s1);
}
uint64_t basic_fletcher64(uint32_t *data, const size_t length)
{
uint32_t s1 = 0;
uint32_t s2 = 0;
for (size_t i = 0; i < length; i++)
{
// UINT32_MAX = 4294967295ULL = ((((uint64_t) 1) << 32) - ((uint64_t) 1))
s1 = (uint32_t) (((uint64_t) s1 + (uint64_t) data[i]) % UINT32_MAX);
s2 = (uint32_t) (((uint64_t) s2 + (uint64_t) s1) % UINT32_MAX);
}
return (((uint64_t) s2) << 32) | ((uint64_t) s1);
}