Pregunta
¿Cómo calcular la codificación CRC_B en C # como se describe en ISO 14443? Aquí hay alguna información de fondo:
codificación CRC_B Este anexo se proporciona con fines explicativos e indica los patrones de bits que se existe en la capa física. Se incluye con el propósito de verificar un ISO / IEC 14443-3 Implementación tipo B de la codificación CRC_B. Consulte ISO / IEC 3309 y CCITT X.25. 2.2.7 y V.42 8.1.1.6.1 para más detalles. Valor inicial = 'FFFF'
- Ejemplo 1: para 0x00 0x00 0x00 debería terminar con CRC_B de 0xCC 0xC6
- Ejemplo 2: para 0x0F 0xAA 0xFF debería terminar con CRC_B de 0xFC 0xD1
Probé algunas bibliotecas CRC16 aleatorias pero no me están dando los mismos resultados. Tampoco obtuve los mismos resultados de las comprobaciones en línea como en aquí .
Solución
Invertí esto del código C en ISO / IEC JTC1 / SC17 N 3497 so no es bonito pero hace lo que necesitas:
public class CrcB
{
const ushort __crcBDefault = 0xffff;
private static ushort UpdateCrc(byte b, ushort crc)
{
unchecked
{
byte ch = (byte)(b^(byte)(crc & 0x00ff));
ch = (byte)(ch ^ (ch << 4));
return (ushort)((crc >> 8)^(ch << 8)^(ch << 3)^(ch >> 4));
}
}
public static ushort ComputeCrc(byte[] bytes)
{
var res = __crcBDefault;
foreach (var b in bytes)
res = UpdateCrc(b, res);
return (ushort)~res;
}
}
Como prueba, pruebe el siguiente código:
public static void Main(string[] args)
{
// test case 1 0xFC, 0xD1
var bytes = new byte[] { 0x0F, 0xAA, 0xFF };
var crc = CrcB.ComputeCrc(bytes);
var cbytes = BitConverter.GetBytes(crc);
Console.WriteLine("First (0xFC): {0:X}\tSecond (0xD1): {1:X}", cbytes[0], cbytes[1]);
// test case 2 0xCC, 0xC6
bytes = new byte[] { 0x00, 0x00, 0x00 };
crc = CrcB.ComputeCrc(bytes);
cbytes = BitConverter.GetBytes(crc);
Console.WriteLine("First (0xCC): {0:X}\tSecond (0xC6): {1:X}", cbytes[0], cbytes[1]);
Console.ReadLine();
}