将 CRC16 计算从 C 转换为 C#

Converting CRC16 calculation from C to C#

我必须将 CRC16 计算从 C 转换为 C#,但得到的消息是我无法在 (crc & 0x8000) 和 [=13= 上将类型 'int' 隐式转换为 'bool' ]

目前的代码:

public unsafe short Crc16(string str)
{
    short crc = 0;

    for(int i = 0; i < str.Length; i++)
    {
        crc = (crc << 1) ^ str[i] ^ ((crc & 0x8000) ? 0x1021 : 0);
    }
    return (crc & 0xFFFF);
}

编辑:将 char 参数更改为字符串

原始C代码

short Crc16( char *str )
{
    short crc=0;
    unsigned int i;
    for (i=0; i<strlen(str); i++)
        crc = (crc << 1) ^ *(str+i) ^ ((crc & 0x8000)? 0x1021:0 );
    return (crc & 0xffff);
}

在C中,0FALSE是同义词,任何不是0的数都是真的。 (reference)

要进行转换,您可以这样做:

public short CalcCrc16(string str)
{
    short crc = 0;
    int i;

    unchecked
    {
        foreach(char c in str)
        {
            short exponent = (crc & 0x8000) != 0 ? 0x1021 : 0;
            crc = (crc << 1) ^ ((short)c) ^ exponent);
        }

        return (short)(crc & 0xFFFF);
    }
}

现在我们有了要使用的 C 代码,我更改了此处的代码示例以匹配。以下是对变化的解释:

  • char* 是字符串
  • 的 C 等价物
  • for循环遍历字符*(str + i)可以重写为str[i],相当于C#的str.GetChar(i)
  • 三元条件判断指数是0x1021还是0
  • 我把这些线分开了,这样你可以更清楚地看到算法。
  • 我把字符上的for(int i = 0; i < str.Length; i++)改成了foreach,因为这样更容易理解。