mdelatorre icon

Internet Checksum in C

mdelatorre | PRO | 02/11/16 07:20:58 PM UTC | 0 ⭐ | 758 👁️ | Never ⏰ | []
C |

1.21 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
 
// Type definitions
typedef unsigned short w16;  // 16-bit word is a short int
typedef unsigned long w32;   // 32-bit word is a long int
 
// Prototypes
w16 checksum(w16 len, w16 buff[]);
 
/*
*************************************************************************hi
Function: checksum
Description: Calculate the 16 bit Internet Checksum.
***************************************************************************
*/
 
w16 checksum(w16 len, w16 buff[])
{
w16 word16;
w32 sum=0;
w16 i;
 
// make 16 bit words out of every two adjacent 8 bit words in the packet
// and add them up
 
// u16 buff[] is an array containing all the octets in the data.
for (i=0;i<len;i=i+2){
    word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
    sum = sum + (w32) word16;
}
 
// take only 16 bits out of the 32 bit sum and add up the carries
while (sum>>16)
      sum = (sum & 0xFFFF)+(sum >> 16);
 
// one's complement the result
sum = ~sum;
 
return ((w16) sum);
}
int main(void)
{
 
w16 octets = 4;
w16 result;
    
    w16 buffer[]={0xBE,0xBE,0xC0,0xCA};
    result = checksum(octets,(w16 *)buffer);
 
// Output the checksum
  printf("checksum = %04X \n", result);
    
    return(0);
}

Comments