Solved

# Checksum function

Posted on 2006-07-10

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.