Função para calcular um checksum CRC16
Eu estou trabalhando em uma biblioteca para fornecer comunicação confiável simples através de uma conexão RS232 ou RS485. Parte deste código envolve o uso de uma soma de verificação CRC16 nos dados para detectar a corrupção do ruído de linha. Eu criei uma função para calcular uma soma de verificação CRC16, mas não parece estar saindo valores corretos.
O código relevante que escrevi está abaixo (também pode ser encontradoAqui).
<code>#include <stdint.h> #define CRC16 0x8005 uint16_t gen_crc16(const uint8_t *data, uint16_t size) { uint16_t out = 0; int bits_read = 0, bit_flag; /* Sanity check: */ if(data == NULL) return 0; while(size > 0) { bit_flag = out >> 15; /* Get next bit: */ out <<= 1; out |= (*data >> (7 - bits_read)) & 1; /* Increment bit counter: */ bits_read++; if(bits_read > 7) { bits_read = 0; data++; size--; } /* Cycle check: */ if(bit_flag) out ^= CRC16; } return out; } </code>
Estou verificando minha saída contraesta calculadora CRC online.
Cheguei à conclusão de que meu entendimento de como calcular um CRC16 está errado ou a calculadora on-line está errada (a primeira parece mais provável). Alguém pode me dizer onde eu poderia estar errado?