unsigned short ComputeChecksum(unsigned short *data, int size)
{
register int nleft=size;
unsigned long checksum = 0;
while(nleft>1)
{
checksum=checksum+*data++;
nleft=nleft-sizeof(unsigned short);
}
if(nleft)
checksum=checksum+*(unsigned char*)data;
checksum=(checksum>>16)+(checksum&0xffff);
checksum=checksum+(checksum>>16);
return (unsigned short)(~checksum);
}
You can translate above code in any language (either Java or C#). It was written in C language.