Как рассчитать кодировку 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'
Я пробовал несколько случайных библиотек CRC16, но они не дают таких же результатов. Я не получил таких же результатов онлайн-проверок, как в здесь.





Я изменил это из кода 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();
}
Какие байтовые значения вы используете для создания исключения? Я пробовал массу вариантов, но не могу получить переполнение. Возможно, необходимо переполнение, я недостаточно знаком с компиляторами C, чтобы знать, используется ли это по умолчанию. Я изменил код, чтобы отразить это.
Так и было. Мне пришлось снять флажок «Проверить арифметическое переполнение / потерю значимости» в свойствах проекта, чтобы эта функция работала с SharpDevelop IDE.
Когда я пытаюсь запустить этот тест, я получаю следующее исключение: System.OverflowException: арифметическая операция привела к переполнению. Он указывает на строку: ch = (byte) (ch ^ (ch << 4));