晕了,懂C#的进,有难题!

handsomge 2010-04-03 05:55:14
哥们帮忙看看这个算法怎么转成C#, 多谢啦!不限手法,只要结果正确
我用C#通过串口跟C++写的嵌入软件进行通讯,下位机使用如下算法进行校验。我已经晕头转向了,兄弟们救命啊!

struct B
{
unsigned char lo;
unsigned char hi;
};
union w2b
{
unsigned short w;
struct B b;
};
union s2b
{
signed short w;
struct B b;
};
unsigned short CRC16(unsigned char *buf, unsigned char len)
{
union w2b CRC16;
unsigned char i,j;
unsigned short poly = 0xa001;

CRC16.w = 0xffff;
while(len--)
{
CRC16.b.lo ^= *buf++;
for (i = 0; i < 8; i++)
{
j = CRC16.b.lo & 0x01;
CRC16.w >>= 1;
if (j) CRC16.w ^= poly;
};
};
return CRC16.w;
}
...全文
165 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
handsomge 2010-04-04
  • 打赏
  • 举报
回复
搞定,谢谢各位朋友!
上代码

public class CRC16
{

struct B
{
public byte lo;
public byte hi;
}
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct w2b
{
[FieldOffset(0)]
public ushort w;
[FieldOffset(0)]
public B b;
}
public ushort CRC16(byte[] buf, byte len)
{
w2b crc16;
byte i, j, p = 0;
ushort poly = 0xa001;

crc16.b.lo = 0x00;
crc16.w = 0xffff;
while (len-- > 0)
{
crc16.b.lo ^= buf[p++];
for (i = 0; i < 8; i++)
{
j = (byte)(crc16.b.lo & 0x01);
crc16.w >>= 1;
if (j > 0)
crc16.w ^= poly;
}
}
return crc16.w;

}

}
Markerhao 2010-04-03
  • 打赏
  • 举报
回复
为什么在c++板块问呢?
jackyjkchen 2010-04-03
  • 打赏
  • 举报
回复
那个啥,里面还是有疏漏的,union不能用的关系,CRC16.b.lo还有单独的运算,你看着改下
cattycat 2010-04-03
  • 打赏
  • 举报
回复
这个计算CRC的函数,char数组用byte就可以了,其他的基本不用变,jackyjkchen的代码很好。
jackyjkchen 2010-04-03
  • 打赏
  • 举报
回复
语法给你改城C#,逻辑不管,另外C#里没有union,怎么办自己想办法,不过至少对函数返回结果没有影响


namespace CRC16
{
class CCRC16
{
struct B
{
byte lo;
byte hi;
}
struct w2b
{
B b;
ushort w;
}
struct s2b
{
short w;
B b;
}
ushort CRC16(byte []buf, byte len)
{
w2b CRC16;
byte i = 0,j = 0,k = 0;
ushort poly = 0xa001;

CRC16.w = 0xffff;
while(len--)
{
CRC16.b.lo ^= buf[k];
for (i = 0; i < 8; i++)
{
j = CRC16.b.lo & 0x01;
CRC16.w >>= 1;
if (j) CRC16.w ^= poly;
}
k++;
}
return CRC16.w;
}
}
}
handsomge 2010-04-03
  • 打赏
  • 举报
回复
下位机是别人写的
handsomge 2010-04-03
  • 打赏
  • 举报
回复
可怜的是,原理我也没看明白
jackyjkchen 2010-04-03
  • 打赏
  • 举报
回复
就算是改也是很简单的,类型都是兼容的就名字不同而已,指针改成下标,运算逻辑都不用动
jackyjkchen 2010-04-03
  • 打赏
  • 举报
回复
如果仅仅是CRC校验,C#有现成的,何必自己写。

普天之下也就是C、C++程序员最可怜,标准库有但是烂,代码多但是滥,三方库有但是复杂。

还是C#好,微软给你们准备好了一切
lzsh0622 2010-04-03
  • 打赏
  • 举报
回复
这个C++函数正确吗? 楼主大概描述一下校验原理,大家省些时间

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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