crc-16 IBM, 0x00 no tomado en consideración
Probé una implementación de crc-16/ibm que encontré en la web. Cuando lo probé con una matriz de bytes hexadecimales, funcionó bien, pero si incluyo algunos valores 0x00, entonces no da el resultado correcto.
Aquí está su código:
unsigned short ComputeCRC16(const unsigned char* buf, unsigned int len) {
unsigned short crc = 0;
for (unsigned int j = 0; j < len; j++)
{
unsigned char b = buf[j];
for (unsigned char i = 0; i < 8; i++)
{
crc = ((b ^ (unsigned char)crc) & 1) ? ((crc >> 1) ^ 0xA001) : (crc >> 1);
b >>= 1;
}
}
return crc;
}
Lo probé con este código:
int main() {
//fe b5 5f f7
unsigned char buf1[4096] = { 0xfe, 0xb5, 0x5f, 0xf7 };
//fe b5 00 5f f7 00
unsigned char buf2[4096] = { 0xfe, 0xb5, 0x00, 0x5f, 0xf7, 0x00 };
int a = strlen(buf1);
unsigned short res = ComputeCRC16(buf1, a);
printf("res = %04x\n", res); //res : 7858, el resultado es correcto
int b = strlen(buf2);
unsigned short res = ComputeCRC16(buf2, b);
printf("res = %04x\n", res); //res : d781, el resultado no es correcto
return 0; //el resultado correcto : 26EE
}
Para verificar el resultado, utilizo este sitio web:
davy.ai
Problema con la implementación CRC-16/IBM
Un experto en TI especializado en arreglos, c y crc16 compartió que probó una implementación CRC-16/IBM que encontró en la red usando un arreglo de bytes hexadecimal. Mencionó que la implementación funciona bien hasta que se incluyen algunos valores
0x00
en el arreglo de bytes. En este escenario, la implementación no da el resultado adecuado.El código de la implementación se muestra a continuación:
Para demostrar el problema, el experto en TI probó la implementación con dos arreglos de bytes,
buf1
ybuf2
. El arreglobuf1
estaba compuesto por0xfe, 0xb5, 0x5f, 0xf7
, mientras que el arreglobuf2
consistía en0xfe, 0xb5, 0x00, 0x5f, 0xf7, 0x00
. Cuando aplicaron la implementación enbuf1
, el resultado fue correcto (es decir,7858
), mientras que parabuf2
, el resultado fue incorrecto (es decir,d781
).Tras investigar, el experto en TI supuestamente encontró que el código de la implementación no maneja correctamente los valores
0x00
. Por ejemplo, durante la ejecución, cuando el valor deb
es0x00
, la declaración condicional relevante causa que el valor decrc
se desplace hacia la derecha solo en uno, en lugar de dos. Esto provoca una manipulación incorrecta de bits y da como resultado un valor de CRC incorrecto.