Red de conocimiento informático - Programación de la red - ¿Quién puede obtener puntuaciones altas en la tabla de verificación CRC-16 escrita en lenguaje C?

¿Quién puede obtener puntuaciones altas en la tabla de verificación CRC-16 escrita en lenguaje C?

#Defina el polinomio CRC 16 del modo de verificación 0x8005//polinomio CRC _ 16.

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>

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);

}