2008-10-14 4 views
2

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

CRC_B кодирование Это приложение предоставляется для пояснительных целей и указывает битовые шаблоны, которые будут существовать на физическом уровне. Он включен для проверки реализации кодировки CRC_B в стандарте ISO/IEC 14443-3. Для получения дополнительной информации см. 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, но они не дают мне тех же результатов. Я не получал таких же результатов от онлайн-проверок, как в here.

ответ

2

я отменил это из кода 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(); 
} 
+0

Я получаю следующее исключение, когда я пытаюсь запустить этот тест: System.OverflowException: арифметическая операция привела к переполнению. Указывает на строку: ch = (байт) (ch^(ch << 4)); – 2008-10-16 19:24:55

 Смежные вопросы

  • Нет связанных вопросов^_^