关于CRC16验证过程

szyuchao 2009-11-03 03:45:46
由于要通过SOCKET进行通讯。在应答客户端时要发送一个数据包,包格式如下
EXT --》包头--》0x02
ADDR --》2个字节‘FF’
ACK --》1个字节‘1’
CRC --》2个字节 0x000,0x000
ETX --》包尾--》0x03

我的方法是这样的。
byte[] by = new byte[] { 0x02, (byte)Convert.ToChar("F"), (byte)Convert.ToChar("F"), 1, 0X000,0X000, 0x03 };
GetCrc_16(by, by.Length);

//生成校验码
public static byte[] GetCrc_16(byte[] _bys, int nLength)
{
short cRc_16 = 0x0000; // 初始化
int _index = 0;
while (nLength > 0)
{
cRc_16 = (short)((cRc_16 << 8) ^ crc_tbl[((cRc_16 >> 8) ^ _bys[_index]) & 0xff]);
nLength--;
_index++;
}
Byte[] CRCs = ShortToByte(cRc_16);
_bys[_bys.Length - 3] = CRCs[0];
_bys[_bys.Length - 2] = CRCs[1];
return _bys;
}

//short 转换成BYTE
public static byte[] ShortToByte(short _CRC_16)
{
byte[] b = new byte[2];
b[0] = (byte)((0xff & _CRC_16) >> 8);
b[1] = (byte)(0xff & _CRC_16);
return b;
}

请高手告诉我。是否对的。如果错了。错在哪里?

...全文
89 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
szyuchao 2009-11-04
  • 打赏
  • 举报
回复
我顶起来。
szyuchao 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qldsrx 的回复:]
怎么感觉怪怪的,一般CRC校验是对数据部分校验的,你怎么连同包头包尾还有CRC码自身都校验了。另外你那个GetCrc_16(by, by.Length); 执行后的返回值怎么不捕获?
[/Quote]
忘了改了。不用返回。想直接改变byte数组中的CRC值
qldsrx 2009-11-03
  • 打赏
  • 举报
回复
怎么感觉怪怪的,一般CRC校验是对数据部分校验的,你怎么连同包头包尾还有CRC码自身都校验了。另外你那个GetCrc_16(by, by.Length); 执行后的返回值怎么不捕获?
szyuchao 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nahaitao 的回复:]
等晚上回家吧,要是你还没有解决的话,给你发个例子吧,到时给我个邮箱什么的就行;
我记得是把高低字节分开为两个数组,定义个函数处理就行;
具体怎么操作,时间长了,想不起来了
[/Quote]

我只是想知道我的这个方法是否对的。如果错了。麻烦nahaitao做详解。
nashina 2009-11-03
  • 打赏
  • 举报
回复
等晚上回家吧,要是你还没有解决的话,给你发个例子吧,到时给我个邮箱什么的就行;
我记得是把高低字节分开为两个数组,定义个函数处理就行;
具体怎么操作,时间长了,想不起来了
szyuchao 2009-11-03
  • 打赏
  • 举报
回复
麻烦高手指点。没有做过。在网上找的例子。参照写的。
ljb07976513524 2009-11-03
  • 打赏
  • 举报
回复
my god
nashina 2009-11-03
  • 打赏
  • 举报
回复
以前做xmodem串口文件传输时做过,网上有很多例子,现在一时也想不起来;
你要是不会的话,给我留个言,我给你发个例子,不过得晚上才有空

110,536

社区成员

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

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

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