我是一名初级开发人员。 我遇到了转换问题,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算法。
答案 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;
}