10#ifndef SEMF_UTILS_PROCESSING_CRCSOFTWARE_H_
11#define SEMF_UTILS_PROCESSING_CRCSOFTWARE_H_
28template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
38 explicit CrcSoftware(T polynomial = DEFAULT_POLYNOMIAL, T initValue = DEFAULT_INITVALUE, T finalXor = DEFAULT_FINALXOR);
42 const uint8_t*
accumulate(
const uint8_t data[],
size_t dataSize)
override;
43 const uint8_t*
calculate(
const uint8_t data[],
size_t dataSize)
override;
44 bool isEqual(
const uint8_t data[])
override;
45 size_t bitSize()
const override;
54 static T invertBitSequence(T value);
56 const T m_invertedPolynomial;
65template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
67: m_invertedPolynomial(invertBitSequence(polynomial)),
68 m_initValue(initValue),
70 m_crc(initValue ^ m_finalXor)
74template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
78 m_crc = m_initValue ^ m_finalXor;
81template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
85 for (
size_t i = 0; i < dataSize; i++)
89 for (
int i = 0; i < 8; i++)
91 T sum = ~((m_crc & 1) - 1);
92 m_crc = (m_crc >> 1) ^ (m_invertedPolynomial & sum);
96 SEMF_INFO(
"accumulated with data %p and size %u to crc value %u", data, dataSize, m_crc);
97 return reinterpret_cast<const uint8_t*
>(&m_crc);
100template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
103 m_crc = m_initValue ^ m_finalXor;
104 accumulate(data, dataSize);
105 SEMF_INFO(
"calculated with data %p and size %u to crc value %u", data, dataSize, m_crc);
106 return reinterpret_cast<const uint8_t*
>(&m_crc);
109template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
117 bool e = std::memcmp(
reinterpret_cast<const uint8_t*
>(&m_crc), data,
sizeof(T)) == 0;
122template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
125 return sizeof(T) * 8;
128template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
131 size_t ret = bitSize() / 8;
132 return (bitSize() % 8 == 0) ? ret : ret + 1;
135template <
typename T, T DEFAULT_POLYNOMIAL, T DEFAULT_INITVALUE, T DEFAULT_FINALXOR>
139 for (
size_t i = 0; i <
sizeof(T) * 8; i++)
141 retVal |= (((1 << i) & value) ? 1u : 0u) << (
sizeof(T) * 8 - 1 - i);
Template class for CRC generation in software.
size_t bitSize() const override
Returns the size of the CRC in bits.
virtual ~CrcSoftware()=default
const uint8_t * accumulate(const uint8_t data[], size_t dataSize) override
Computes the CRC of the input data using a combination of the previous CRC value and the new one.
void reset()
Resets internal values to their initial values.
size_t byteSize() const override
Returns the size of the CRC in bytes.
const uint8_t * calculate(const uint8_t data[], size_t dataSize) override
Calculates the CRC of the input data.
bool isEqual(const uint8_t data[]) override
Checks if previously calculated CRC is equal to the input value.
CrcSoftware(T polynomial=DEFAULT_POLYNOMIAL, T initValue=DEFAULT_INITVALUE, T finalXor=DEFAULT_FINALXOR)
Constructor.
Interface for implementing cyclic redundancy check (CRC).
CrcSoftware< uint8_t, 0x07, 0xFF, 0xFF > Crc8Sofware
CrcSoftware< uint32_t, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF > Crc32Software
CrcSoftware< uint16_t, 0x1021, 0xFFFF, 0xFFFF > Crc16Software