O CRC (Cyclic Redundancy Check) é um código corretor de erro usado comumente em redes de comunicações digitais e também em dispositivos de armazenamento para detectar mudanças acidentais nos dados brutos. Blocos de dados que são processados por esses sistemas recebem um pequeno valor que é calculado baseado no resto da divisão polinomial de seus conteúdos. Na recepção/leitura dos dados, o cálculo deve ser repetido e, caso o valor de checagem calculado não seja idêntico ao que foi transmitido/gravado junto com a informação, uma ação corretiva deverá se adotada quanto à provável corrupção dos dados.
Os CRCs são assim chamados devido ao fato de o valor usado para a checagem ser uma redundância, ou seja, um artefato expande o tamanho da mensagem sem, porém, adicionar informação. O algoritmo usado na sua concepção é baseado em códigos cíclicos. CRCs são populares pois são simples de implementar em hardware, fáceis de analisar matematicamente e particularmente bons na detecção de erros comuns causados pela transmissão de dados em canais ruidosos. Devido ao fato de seu valor de conferência/checagem possuir um valor fixo, a função que gera o CRC é ocasionalmente aplicada para o cálculo de resumos (hashs).
A entrada é composta por uma única linha contendo uma string de, no máximo, 16 caracteres.
Veja os exemplos a seguir.
Alo mundo
CRC16-BUYPASS: 0x7FBB
a123456b
CRC16-BUYPASS: 0xFDBB
Realize a implementação em C da função CRC16-BUYPASS, que possui como polinômio gerador 0x8005 ou para ter um código de referência de validação.
O estado inicial do algoritmo para cálculo do CRC16-BUYPASS é 0x0000.
Procure implementar em C de acordo com módulos funcionais que possam ser reaproveitados em ASM MIPS.