سؤال

كيف يتم حساب ترميز 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 العشوائية لكنها لا تعطيني نفس النتائج.لم أحصل على نفس النتائج من الشيكات عبر الإنترنت كما هو الحال في هنا.

هل كانت مفيدة؟

المحلول

لقد عكست هذا من رمز C في ISO/IEC JTC1/SC17 رقم 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top