如何将给定的CRC16 C算法转换为C#算法

时间:2016-01-26 11:30:30

标签: c# crc16

我是一名初级开发人员。 我遇到了转换问题,CRC16检查算法如下。 我必须将下面的C / C ++ CRC-16算法转换为C#算法。 这是CRC-16算法。

unsigned short Crc16(unsigned char* rdata, unsigned int len){
    int i, n;
    unsigned short wCh, wCrc = 0XFFFF;

    for (i = 0; i < len; i++){
        wCh = (uword)*(rdata + i);

        for (n = 0; n < 8; n++){
            if ((wCh^wCrc) & 0x0001)
                wCrc = (wCrc >> 1) ^ 0xA001;
            else
                wCrc >>= 1;
            wCh >>= 1;
        }
    }
    return wCrc;
}

我遇到了这个问题。 我试图直接在我的C#(winform)项目上转换这个算法,但无法解决类型匹配问题。 (例如,unsigned =&gt; ushort,unsigned char * =&gt; ????&#39;我不知道&#39;)

另外,我尝试将上面的代码实现为DLL,然后在我的C#项目上导入DLL文件。但仍然无法解决类型匹配问题。 (例如,[DllImport(&#34; Crc_dll.dll&#34;)] public static extern ushort Crc16(unsigned char * rdata,unsigned int len); =&gt;如何转换unsigned char *,unsigned int ??)< / p>

如果有人知道,你能帮我吗?

由于上述算法是从客户端给出的,我不能使用其他crc16算法。

1 个答案:

答案 0 :(得分:1)

unsigned char* rdata应该只是C#中的byte[] rdata。此外,整数不会在C#(#1)中隐式转换为bool,并且宽结果不会隐式转换为窄目标类型(#2)。

ushort Crc16(byte[] rdata, int len){
    int i, n;
    ushort wCh, wCrc = 0XFFFF;

    for (i = 0; i < len; i++){
        wCh = rdata[i];

        for (n = 0; n < 8; n++){
            if (((wCh^wCrc) & 0x0001) != 0) // #1
                wCrc = (ushort)((wCrc >> 1) ^ 0xA001); // #2
            else
                wCrc >>= 1;
            wCh >>= 1;
        }
    }
    return wCrc;
}