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

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

CRC_B encoding This annex is provided for explanatory purposes and indicates the bit patterns that will exist in the physical layer. It is included for the purpose of checking an ISO/IEC 14443-3 Type B implementation of CRC_B encoding. Refer to ISO/IEC 3309 and CCITT X.25 2.2.7 and V.42 8.1.1.6.1 for further details. Initial Value = 'FFFF'

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 762
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Когда я пытаюсь запустить этот тест, я получаю следующее исключение: System.OverflowException: арифметическая операция привела к переполнению. Он указывает на строку: ch = (byte) (ch ^ (ch << 4));

Tommi L. 16.10.2008 23:24

Какие байтовые значения вы используете для создания исключения? Я пробовал массу вариантов, но не могу получить переполнение. Возможно, необходимо переполнение, я недостаточно знаком с компиляторами C, чтобы знать, используется ли это по умолчанию. Я изменил код, чтобы отразить это.

cfeduke 20.10.2008 19:10

Так и было. Мне пришлось снять флажок «Проверить арифметическое переполнение / потерю значимости» в свойствах проекта, чтобы эта функция работала с SharpDevelop IDE.

Tommi L. 20.10.2008 22:40

Другие вопросы по теме