求高手将C代码转成C#代码

cy2800 2016-11-30 09:33:48
unsigned short CalcCrc16(unsigned char * pData, int nLength)
{
unsigned short cRc_16 = 0x0000; // 初始化
const unsigned short cnCRC_16 = 0x8005;
unsigned long cRctable_16[256];
unsigned short i,j,k;

for (i=0,k=0;i<256;i++,k++)
{
cRc_16 = i<<8;
for (j=8;j>0;j--)
{
if (cRc_16&0x8000) //反转时cRc_16&0x0001
cRc_16 = (cRc_16<<=1)^cnCRC_16; //反转时cRc_16=(cRc_16>>=1)^gEnpoly
else
cRc_16<<=1; //反转时cRc_16>>=1
}
cRctable_16[k] = cRc_16;
}

while (nLength>0)
{
cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *pData) & 0xff];
nLength--;
pData++;
}

return cRc_16;

}
...全文
236 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cy2800 2016-12-01
  • 打赏
  • 举报
回复
自己解决了,谢谢答复!!
crystal_lz 2016-11-30
  • 打赏
  • 举报
回复
if (cRc_16&0x8000) 你写的是 if(ret > 0) 正常情况下 0表示false 非0表示true而你写成了>0
cy2800 2016-11-30
  • 打赏
  • 举报
回复
这是我写的,但是不对,帮看看那里有问题
cy2800 2016-11-30
  • 打赏
  • 举报
回复
public static int crc16(byte[] data) { int cRc_16 = 0x0000; int cnCRC_16 = 0x8005; byte[] cRctable = new byte[256]; int i, j, k; for (i = 0, k = 0; i < 256; i++, k++) { cRc_16 = i << 8; for (j = 8; j > 0; j--) { int ret = cRc_16 & 0x8000; if (ret > 0) cRc_16 = (cRc_16 <<= 1) ^ cnCRC_16; else cRc_16 <<= 1; } cRctable[k] = Convert.ToByte(cRc_16); } int length = data.Length; int idx = 0; while (length > 0) { cRc_16 = (cRc_16 << 8) ^ cRctable[((cRc_16 >> 8) ^ data[idx]) & 0xff]; length--; idx++; } return cRc_16; }
  • 打赏
  • 举报
回复
不过确实与你的C编译器也有关系unsigned long 有可能是4字节,也有可能是8字节,因为还有个long long
  • 打赏
  • 举报
回复
基本上全盘照写就可以 unsigned short 在C#中就是ushort unsigned char * pData就是byte[] pData int i = 0; while (nLength>0 && i < pData.Length) { cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ * pData[i]) & 0xff]; nLength--; i++; }

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧