C# 如何计算C中的CRC_B#

C# 如何计算C中的CRC_B#,c#,crc,iso,C#,Crc,Iso,如何计算ISO 14443中描述的C#中的CRC#U 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,应以0xCC 0xC6的CRC_B结束 示例2:对于0x0F 0xAA 0xFF,应以0xF

如何计算ISO 14443中描述的C#中的CRC#U 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,应以0xCC 0xC6的CRC_B结束
  • 示例2:对于0x0F 0xAA 0xFF,应以0xFC 0xD1的CRC_B结束

我尝试了一些随机的CRC16库,但它们没有给我相同的结果。我在中也没有从在线检查中得到相同的结果。

我在中从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;
    }
}

当我尝试运行此测试时,出现以下异常:System.OverflowException:算术运算导致溢出。它指向第行:ch=(字节)(ch^(ch)创建异常时您使用的字节值是什么?我尝试了大量的变体,但无法获得溢出。可能是溢出是必要的,我对C编译器不够熟悉,不知道这是否是默认值。我修改了代码以反映这一点。就是这样。我必须取消选中从项目属性中选择“检查算术溢出/下溢”选项,使其与SharpDevelop IDE一起工作。
 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();
}