1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
#include <stdio.h>
#define DBG 1
int cksum16 (void const *p, size_t len)
{
/* per defaut : erreur */
int cs = -1;
/* parite paire ? */
if ((len & 1) == 0)
{
/* acceder aux donnees en mode byte */
unsigned char const *po = p;
unsigned i;
/* initialisation du CS */
cs = 0;
for (i = 0; i < len; i += 2)
{
/* convention reseau : MSB en tete */
unsigned n = 0;
n |= (po[i + 0] & 0xFF) << (8 * 1); /* MSB */
n |= (po[i + 1] & 0xFF) << (8 * 0); /* LSB */
#if DBG
printf ("po[%u+0]=%d po[%u+1]=%d\n", i, po[i + 0], i, po[i + 1]);
#endif
cs += n;
#if DBG
printf ("n=%04X cs=%04x\n", n, cs);
#endif
}
/* complement a 1 sur 16 bits */
cs = ~cs & 0xFFFF;
}
return cs;
}
int main (void)
{
unsigned char data[20] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int cs = cksum16 (data, 8);
if (cs != -1)
{
printf ("cs = %04X\n", cs);
}
else
{
puts ("cs error");
}
return 0;
} |
Partager