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.