You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Concox VTS设备的CRC-16/X-25 C#计算实现方案

CRC-16/X-25 C#实现(适配Concox VTS设备)

你需要的是CRC-16/X-25算法的实现,而非CRC32。该算法的核心参数如下:

  • 多项式:0x1021
  • 初始CRC值:0xFFFF
  • 输入字节:按位反转
  • 输出结果:按位反转后异或0xFFFF

实现代码(查表法,效率更高)

public static class Crc16X25
{
    private static readonly ushort[] CrcTable = new ushort[256];

    static Crc16X25()
    {
        ushort polynomial = 0x1021;
        for (ushort i = 0; i < 256; i++)
        {
            ushort crc = 0;
            ushort currentByte = (ushort)(i << 8);
            for (byte j = 0; j < 8; j++)
            {
                if (((crc ^ currentByte) & 0x8000) != 0)
                {
                    crc = (ushort)((crc << 1) ^ polynomial);
                }
                else
                {
                    crc <<= 1;
                }
                currentByte <<= 1;
            }
            CrcTable[i] = crc;
        }
    }

    public static ushort Compute(byte[] data)
    {
        ushort crc = 0xFFFF;
        foreach (byte b in data)
        {
            byte reversedByte = ReverseBits(b);
            crc = (ushort)((crc << 8) ^ CrcTable[(crc >> 8) ^ reversedByte]);
        }
        crc = ReverseBits((ushort)crc);
        return (ushort)(crc ^ 0xFFFF);
    }

    private static byte ReverseBits(byte b)
    {
        return (byte)(((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16);
    }

    private static ushort ReverseBits(ushort value)
    {
        return (ushort)(((ReverseBits((byte)(value >> 8))) | ((ushort)ReverseBits((byte)value) << 8)));
    }
}

直接计算法(无查表,适合小数据量)

public static class Crc16X25Direct
{
    public static ushort Compute(byte[] data)
    {
        ushort crc = 0xFFFF;
        ushort polynomial = 0x1021;

        foreach (byte b in data)
        {
            byte reversedByte = ReverseBits(b);
            crc ^= (ushort)(reversedByte << 8);

            for (int i = 0; i < 8; i++)
            {
                if ((crc & 0x8000) != 0)
                {
                    crc = (ushort)((crc << 1) ^ polynomial);
                }
                else
                {
                    crc <<= 1;
                }
            }
        }

        crc = ReverseBits(crc);
        return (ushort)(crc ^ 0xFFFF);
    }

    private static byte ReverseBits(byte b)
    {
        return (byte)(((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16);
    }

    private static ushort ReverseBits(ushort value)
    {
        return (ushort)(((ReverseBits((byte)(value >> 8))) | ((ushort)ReverseBits((byte)value) << 8)));
    }
}

测试你的数据

用你提供的字节数组验证:

byte[] data = { 0x11, 0x01, 0x03, 0x33, 0x33, 0x00, 0x94, 0x10, 0x95, 0x20, 0x20, 0x08, 0x25, 0x81, 0x00, 0x23 };
ushort result = Crc16X25.Compute(data);
Console.WriteLine(result.ToString("X4")); // 输出 90DD

关键说明

  • 输入字节按位反转是CRC-16/X-25的硬性要求,这也是你之前用CRC32库无法得到正确结果的核心原因
  • 最终结果必须经过反转并异或0xFFFF,才能匹配Concox VTS设备的校验规则

内容的提问来源于stack exchange,提问作者Maruf Hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:15:22