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

本文关键字:算法 转换 CRC16 | 更新日期: 2023-09-27 18:31:59

我是一名初级开发人员。我在下面的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) 项目上转换此算法,但无法解决类型匹配问题。(例如,无符号 => ushort,无符号字符* => ????"我不知道")

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

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

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

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

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

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