如何将给定的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算法。
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;
}