如何在C#中计算CRC_B

发布于 2024-07-07 10:32:57 字数 571 浏览 10 评论 0原文

如何按照 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,您应该得到 0xCC 0xC6 的 CRC_B
  • 示例 2:对于 0x0F 0xAA 0xFF,您应该得到 0xFC 0xD1 的 CRC_B

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

How to calculate CRC_B encoding in C# as described in ISO 14443?
Here is some background info:

CRC_B encoding
This annex is provided for explanatory purposes and indicates the bit patterns that will
exist in the physical layer. It is included for the purpose of checking an ISO/IEC
14443-3 Type B implementation of CRC_B encoding. Refer to ISO/IEC 3309 and CCITT X.25
2.2.7 and V.42 8.1.1.6.1 for further details. Initial Value = 'FFFF'

  • Example 1: for 0x00 0x00 0x00 you should end up with CRC_B of 0xCC 0xC6
  • Example 2: for 0x0F 0xAA 0xFF you should end up with CRC_B of 0xFC 0xD1

I tried some random CRC16 libraries but they aren't giving me the same results. I didn't get the same results from online checks either like in here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

落在眉间の轻吻 2024-07-14 10:32:57

我从 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();
}

I reversed this from the C code in ISO/IEC JTC1/SC17 N 3497 so its not pretty but does what you need:

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;
    }
}

As a test, try the code below:

 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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文