¿Quién puede obtener puntuaciones altas en la tabla de verificación CRC-16 escrita en lenguaje C?
typedef carácter sin signo uchar
unidad entera sin signo typedef
typedef sin signo largo ulong
etiqueta de enumeración typedef boolean {falso, verdadero} bool
ulong g_ul table[256];
// crc_16 verifica la función de inicialización y calcula la tabla de restos crc_16.
void _far crc16init(void)
{
uint nremainder
int n, m
ulong; * pultable = g _ ultable
for(n = 0; n lt256; n )
{
nre mainder =(uint)n lt8;
for(m = 8; m gt0; m -)
{
if(nre mainder amp; 0x8000)
{
nre mainder =(nre mainder lt; lt1)^ CRC 16 _polynomial
}
Otros
{
nre mainder =(nre mainder lt; lt1);
}
}
*(pul table n)= nre mainder;
p>}
}
//Calcule el valor crc de un bloque de datos a través de crc_16.
//puc data-Puntero al bloque de datos a verificar.
//nbytes: tamaño del bloque en bytes.
//El valor de retorno es un entero largo sin signo, de los cuales los 16 bits inferiores son válidos.
ulong _ far CRC 16 calc(uchar * puc data, int nbytes)
{
uint nremainder, nret
int n ;
índice uchar;
ulong * pultable = g _ ultable
nremainder = 0x0000
for(n = 0; n ltnbytesn )
{
index =(uchar)crcbitreflect(*(puc data n), 8)^(nre mainder gt; gt8);
nre mainder =(uint)*(índice de tabla pul)^(nre mainder lt; lt8);
}
nret =(uint)crcbitreflect(nre mainder, 16)^ 0x 0000;
Return (nret);
}
// Invierte los bits de los datos y el msb invertido es 1.
//Antes de la reversión: 1110111111111065438.
//Después de la inversión: 111001001111165438.
ulong _ far crcbitreflect(ulong ul data, int nbits)
{
ulong ulresult = 0x00000000l
int n; p>
p>
for(n = 0; n ltnbitsn )
{
if(ul data amp; 0x00000001l)
{
ul resultado | =(ulong)(1l lt; lt((nbits-1)-n));
}
ul datos =(ul datos gt; gt1) ;
}
retorno(resultado ul);
}