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 CRC

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta