Pergunta

Como calcular a codificação CRC_B em C # como descrito na ISO 14443? Eis aqui algumas informações de fundo:

CRC_B codificação Este anexo é fornecido para fins explicativos e indica os padrões de bits que irá existe na camada física. É incluído com a finalidade de verificar um / IEC ISO 14443-3 Tipo B execução de codificação CRC_B. Referem-se a norma ISO / IEC 3309 e CCITT X.25 2.2.7 e V.42 8.1.1.6.1 para mais detalhes. Valor inicial = 'FFFF'

  • Exemplo 1: para 0x00 0x00 0x00 você deve acabar com CRC_B de 0xCC 0xC6
  • Exemplo 2: para 0x0F 0xAA 0xFF você deve acabar com CRC_B de 0xFC 0xD1

Eu tentei algumas bibliotecas CRC16 aleatórios, mas eles não estão me dando os mesmos resultados. Eu não obter os mesmos resultados de cheques online tanto como em aqui .

Foi útil?

Solução

I inverteu esta a partir do código C em ISO / IEC JTC1 / SC17 N 3497 assim não é bonito, mas faz o que você precisa:

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 um teste, tente o código abaixo:

 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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top