programme C (opération sur tableau d’octets) :
#include <stdio.h>
#include <stdint.h>
#define SIZE_TOTAL 59
#define SIZE_IPHEAD 20
uint8_t ip[SIZE_TOTAL]={
0x45,0x00,0x00,0x3b,0x2c,0xf5,0x40,0x00,0x40,0x11,0xd5,0xf7,0xac,0x1a,0x91,0x4a,
0xc1,0x30,0x39,0x30,0xdd,0x9e,0x00,0x35,0x00,0x27,0x37,0xfe,0x7f,0x4a,0x01,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x70,0x72,0x6f,0x78,0x79,0x04,0x70,
0x6c,0x69,0x6c,0x02,0x66,0x72,0x00,0x00,0x1c,0x00,0x01
};
uint16_t checksum(uint8_t *bytes,int size){
uint32_t sum=0;
int i;
for(i=0;i<size;i += 2){
uint8_t h,l;
h=bytes[i];
l=(i<size-1)?bytes[i+1]:0;
sum += ((uint16_t)h<<8)|l;
}
while(sum>>16) sum=(sum&0xffff)+(sum>>16);
return (uint16_t)~sum;
}
int main(void){
uint16_t sum=checksum(ip,SIZE_IPHEAD);
printf("%04x\n",sum);
return 0;
}