如何在C#中计算CRC_B

时间:2008-10-14 19:19:09

标签: c# crc iso

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

  

CRC_B编码   本附件仅用于说明目的,并指出将要使用的位模式   存在于物理层中。包含它是为了检查ISO / IEC   14443-3 CRC_B编码的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库,但他们没有给我相同的结果。我没有像在here中那样获得与在线检查相同的结果。

1 个答案:

答案 0 :(得分: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();
}