2

ISO 14443で説明されているようにC#でCRC_Bエンコーディングを計算する方法は?ここにいくつかの背景情報があります:

CRC_Bエンコーディングこの付録は説明の目的で提供されており、物理層に存在するビットパターンを示しています。これは、CRC_BエンコーディングのISO /IEC14443-3タイプB実装をチェックする目的で含まれています。詳細については、ISO /IEC3309およびCCITTX.252.2.7およびV.428.1.1.6.1を参照してください。初期値='FFFF'

  • 例1:0x00 0x00 0x00の場合、最終的に0xCC0xC6のCRC_Bになるはずです。
  • 例2:0x0F 0xAA 0xFFの場合、最終的に0xFC0xD1のCRC_Bになるはずです。

ランダムなCRC16ライブラリをいくつか試しましたが、同じ結果が得られません。ここのように、オンラインチェックでも同じ結果は得られませんでした。

4

1 に答える 1

2

ISO/IEC JTC1/SC17 N 3497の C コードからこれを逆にしたので、きれいではありませんが、必要なことは行います。

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();
}
于 2008-10-15T03:07:45.480 に答える