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
| uint16 calculate_crc(octet *z_p, uint16 z_message_length)
/* CRC fait tourner l'algorithme de contrôle de redondance cyclique sur l'entrée z_p
*/
/* Renvoie une valeur de 16 bits CRC après achèvement et ajoute */
/* toujours 2 octets CRC au message */
/* renvoie 0 si le CRC du message qui arrive est correct */
{
uint16 CRC= 0xffff;
uint16 next;
uint16 report;
uint16 n;
uint8 crch, crcl;
while (z_message_length--) {
next = (uint16)*z_p;
CRC ^= next;
for (n = 0; n < 8; n++) {
report = CRC & 1;
CRC >>= 1;
if (report) {
CRC ^= 0xA001;
}
}
z_p++;
}
crch = CRC / 256;
crcl = CRC % 256
z_p[z_message_length++] = crcl;
z_p[z_message_length] = crch;
return CRC;
} |
Partager