I am trying to calculate the checksum (which is to obtain the sum of all bytes then obtain the 1's complement) - then store this as 1 byte to a file. I am running on a Linux platform.
I received some feedback from the experts and was given this calculation -
unsigned char Data[12];
int i;
unsigned int CRC ()
{
unsigned int sum;
sum = 0;
for (i=0; i < 12; ++i)
sum += Data[i];
sum ^= sum;
return (sum);
}
However, i had some issues with it - it was populating some bizarre # -
When I use this approach - I believe it works.
#define POLYNOMIAL 0x04C11DB7
#define WIDTH (8 * sizeof(unsigned char))
#define TOPBIT (1 << (WIDTH - 1))
for (int byte = 0; byte < dataSize; ++byte) {
remainder ^= (data[byte] << (WIDTH - 8));
for (unsigned char bit = 8; bit > 0; --bit) {
if (remainder & TOPBIT)
remainder = (remainder << 1) ^ POLYNOMIAL;
else
remainder = (remainder << 1);
}
}
}
return remainder;
I would like to understand what the differences are between the 2 implementations.
They are quite different algorithms. The first solution (which I provided) asked the question that you answered. i.e. sum the bytes and take the 1's complement.
The equation that you've provided solves the checksum issue in quite a bit different fashion than what you'd originally asked.
Good Luck!
Kent