# 16 bit checksum calculation [closed]

I need to calculate checksum using 16-bit ones' complement addition:

while(byte>0)  //len = Total num of bytes
{
Word = ((Buf[i]<<8) + Buf[i+1]) + Checksum; //get two bytes at a time and  add previous calculated checsum value

Checksum = Word & 0x0FFFF; //Discard the carry if any

Word = (Word>>16);     //Keep the carryout for value exceeding 16 Bit

Checksum = Word + Checksum; //Add the carryout if any

len -= 2; //decrease by 2 for 2 byte boundaries
i += 2;
}

Checksum = (unsigned int)~Checksum;


The above code works fine, and if I understood the concept well (to add 16 bits), add the carry if any and then take the compliment.

Are there any improvements or corrections?

• What are the types of Word, Checksum and Buf? It looks like Word must be a uint32_t, Checksum a uint16_t and Buf a uint8_t*, buf the information really ought to be included in the question. Apr 11, 2019 at 12:05
• You'd get better reviews if you provided at least a whole, compilable function. Apr 11, 2019 at 13:06

If the packet size is less than 32k words, then you do not need to add the carry until the end:

while(byte>0)  //len = Total num of bytes
{
Checksum = ((Buf[i]<<8) + Buf[i+1]) + Checksum; //get two bytes at a time and  add previous calculated checsum value

len -= 2; //decrease by 2 for 2 byte boundaries
i += 2;
}

Checksum = (Checksum>>16) + Checksum; //Add the carryout

Checksum = (unsigned int)~Checksum;

• Ok I understand why it could be done at the end only, but I didnt understand 32k words thing. Oct 3, 2012 at 20:00
• If you have more than 32k 16-bit words, you can overflow a 32 bit integer when you add them up. With fewer than 32k words, you cannot overflow. Oct 3, 2012 at 21:18