Как рассчитать CRC_B в C # - PullRequest
       25

Как рассчитать CRC_B в C #

2 голосов
/ 14 октября 2008

Как рассчитать кодировку CRC_B в C #, как описано в ISO 14443? Вот некоторая справочная информация:

кодировка CRC_B Это приложение предоставлено в пояснительных целях и указывает битовые комбинации, которые будут существуют на физическом уровне. Он включен с целью проверки ISO / IEC 14443-3 Тип B реализация кодирования CRC_B. Обратитесь к ISO / IEC 3309 и CCITT X.25 2.2.7 и V.42 8.1.1.6.1 для получения дополнительной информации. Начальное значение = 'FFFF'

  • Пример 1: для 0x00 0x00 0x00 вы должны получить CRC_B 0xCC 0xC6
  • Пример 2: для 0x0F 0xAA 0xFF вы должны получить CRC_B 0xFC 0xD1

Я попробовал несколько случайных библиотек CRC16, но они не дают мне тот же результат. Я не получил те же результаты от онлайн-чеков, как в здесь .

1 Ответ

2 голосов
/ 15 октября 2008

Я изменил это из кода C в ISO / IEC JTC1 / SC17 N 3497 , так что это не красиво, но делает то, что вам нужно:

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;
    }
}

В качестве теста попробуйте код ниже:

 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();
}
...