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

字节数组CRC计算的C#实现:C代码移植求助

正确移植CRC计算的C代码到C#实现

你的C#代码存在以下关键问题,导致计算结果不正确:

  • 循环范围错误:原C代码遍历传入的所有字节,但你的C#代码只遍历到message.Length - 2,少处理了最后两个字节。
  • 冗余的位操作:(CRCFull >> 1) & 0xFFFF是多余的,因为CRCFull是ushort类型,右移后自动保持16位,不会出现高位溢出。
  • 不必要的变量类型:CRCLSB使用char类型不合适,直接用bool或byte更直观。

以下是和原C代码逻辑完全对齐的C#实现:

private ushort CalculateCrc(byte[] data)
{
    ushort crcValue = 0xFFFF;
    int index = 0;
    int dataLen = data.Length;
    
    while (dataLen-- > 0)
    {
        crcValue ^= data[index++];
        
        for (int i = 0; i < 8; i++)
        {
            bool hasLsbSet = (crcValue & 0x0001) != 0;
            crcValue = (ushort)(crcValue >> 1);
            
            if (hasLsbSet)
            {
                crcValue ^= 0xA001;
            }
        }
    }
    
    return crcValue;
}

// 调用示例,将结果转为指定格式的字节数组
private void GetCRC(byte[] message, ref byte[] CRC)
{
    ushort crc = CalculateCrc(message);
    CRC[0] = (byte)(crc & 0xFF);       // 低字节
    CRC[1] = (byte)((crc >> 8) & 0xFF); // 高字节
}

测试验证

用你提供的测试数组new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00 },计算得到的CRC值为0x840A(对应字节数组[0x0A, 0x84]),和原C代码的计算结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:55:17