Calculo de CRC (Verificación de redundancia cíclica)

Hola a todos.
El CRC es un sistema que suele usarse para verificar o detectar errores en la transmisión de datos y está basado en la división de polinomios. Por ejemplo, como era mi caso, en la comunicación entre una aplicación Velneo y un dispositivo de pago tipo PIN PAD, haciendo uso del objeto Puerto TCP/IP.
En la mayoría de casos lo que enviamos y recibimos son tramas de datos en hexadecimal con la estructura específica del fabricante, con o sin cifrar y también es bastante habitual que a la trama tengamos que añadir un bloque CRC de validación. Pues bien, para hacer el cálculo CRC he creado el siguiente script JavaScript que comparto por si a alguien le es útil:

// Función que calcula el CRC:
function crc16_ccitt(hexString) {
    var POLYNOMIAL = 0x1021;
    var crc = 0x0000;

    // Convertir la cadena hexadecimal en un array de bytes
    var buffer = [];
    for (var i = 0; i < hexString.length; i += 2) {
        buffer.push(parseInt(hexString.substr(i, 2), 16));
    }

    // Iterar sobre cada byte del buffer
    for (var i = 0; i < buffer.length; i++) {
        crc ^= (buffer[i] << 8); // Byte XOR en el byte de orden superior del CRC de 16 bits

        for (var bit = 0; bit < 8; bit++) {
            if ((crc & 0x8000) !== 0) { // Si el bit de orden superior está establecido
                crc = (crc << 1) ^ POLYNOMIAL;
            } else {
                crc <<= 1;
            }
            crc &= 0xFFFF; // Nos aseguramos de que CRC siga siendo de 16 bits
        }
    }

    return crc & 0xFFFF;
}

// Retorno del CRC calculado
var hexString = theRoot.varToString("DATA");
var crc = crc16_ccitt(hexString);
theRoot.setVar("VAL_CRC", crc.toString(16).toUpperCase()); // Salida en hexadecimal

Este script está pensado, como veis al final, para ser asociado a un proceso tipo JavaScript al que pasamos el dato hexadecimal en la variable DATA y una vez calculado el CRC lo obtenemos en la variable VAL_CRC. Todo esto obviamente se puede modificar según necesidades.
Indicar también que hay multitud de modalidades CRC y este script sirve concretamente para la modalidad CRC 16 CCITT que es de la más comunes. No obstante, lo importante a tener en cuenta es el polinomio y el valor inicial utilizados para cada modalidad y en tal caso tendréis que ver la documentación disponible.
Un saludo.