2

如何按照 ISO 14443 中的描述计算 C# 中的 CRC_B 编码?以下是一些背景信息:

CRC_B 编码 本附件用于说明目的,并指示将存在于物理层中的比特模式。包含它是为了检查 CRC_B 编码的 ISO/IEC 14443-3 B 类实现。有关详细信息,请参阅 ISO/IEC 3309 和 CCITT X.25 2.2.7 和 V.42 8.1.1.6.1。初始值 = 'FFFF'

  • 示例 1:对于 0x00 0x00 0x00,您应该以 0xCC 0xC6 的 CRC_B 结尾
  • 示例 2:对于 0x0F 0xAA 0xFF 你应该以 0xFC 0xD1 的 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 回答