Cómo configurar el cálculo de la tabla CRC
Hay muchos ejemplos de cálculo CRC por ahí. Implementaciones simples con desplazamiento de bits y más eficientes con una tabla precalculada. Pero también hay muchos parámetros de un CRC junto al polinomio que afectan el cálculo. Puede evaluar estos parámetros aquí:http://zorc.breitbandkatze.de/crc.html
Estos parámetros son
valor inicial de CRCreflejo de los datos de entradareflejo de datos de salidavalor final de XOR para CRCPara algunos algoritmos CRC "estándar", estos parámetros están bien definidos, como CRC-16 (CCITT). Pero hay algunas implementaciones que usan diferentes parámetros.
Mi implementación tiene que ser compatible con un CRC16 con un polinomio CCITT (xdieciséis + x12$12reflejo de datos de salida13$
¿Cómo se pueden calcular los parámetros de reflexión del CRC en el método de inicialización?
Editar: ¿Cómo debo hacer para controlar cada uno de los parámetros individualmente? Me gustaría entender cómoInit
La función realmente funciona y cómo se implementan todos los parámetros.
typedef unsigned char uint8_t;
typedef unsigned short crc;
crc crcTable[256];
#define WIDTH (8 * sizeof(crc))
#define TOPBIT (1 << (WIDTH - 1))
#define POLYNOMIAL 0x1021
template<typename t>
t reflect(t v)
{
t r = 0;
for (int i = 0; i < (8 * sizeof v); ++i)
{
r <<= 1;
r |= v&1;
v >>= 1;
}
return r;
}
void Init()
{
crc remainder;
for (int dividend = 0; dividend < 256; ++dividend)
{
remainder = dividend << (WIDTH - 8);
for (uint8_t bit = 8; bit > 0; --bit)
{
if (remainder & TOPBIT)
remainder = (remainder << 1) ^ POLYNOMIAL;
else
remainder = (remainder << 1);
}
crcTable[dividend] = remainder;
}
}
crc Calculate(const uint8_t *message, int nBytes, crc wOldCRC)
{
uint8_t data;
crc remainder = wOldCRC;
for (int byte = 0; byte < nBytes; ++byte)
{
data = reflect(message[byte]) ^ (remainder >> (WIDTH - 8));
remainder = crcTable[data] ^ (remainder << 8);
}
return reflect(remainder);
}
int main()
{
crc expected = 0x6f91;
uint8_t pattern[] = "123456789";
Init();
crc result = Calculate(pattern, 9, 0xFFFF);
if (result != expected)
{
// this output is not relevant to the question, despite C++ tag
printf("CRC 0x%04x wrong, expected 0x%04x\n", result, expected);
}
}