CRC校验运算问题,请各位兄弟姐妹帮帮看看。 ( 积分: 100 )

  • 主题发起人 主题发起人 modaji
  • 开始时间 开始时间
M

modaji

Unregistered / Unconfirmed
GUEST, unregistred user!
CRC运算<br><br>uchar&nbsp;&nbsp;&nbsp;bus_recv_buf[] ;&nbsp;&nbsp;&nbsp;接收缓存区位置<br>长度=第1字节去掉高4位,CRC的字节高4位强制为3<br>函数返回1 CRC正确<br>返回0 CRC错误<br>uchar&nbsp;chk_crc16(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;l,&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;crc;<br>&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;ch,&nbsp;cl;<br>&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;=&nbsp;0x0000;<br>&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;=&nbsp;(bus_recv_buf[0]&amp;0x0f)&nbsp;-&nbsp;2; //长度=第1字节去掉高4位<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(n&nbsp;=&nbsp;0;&nbsp;n&nbsp;&lt;&nbsp;l;&nbsp;n++)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;=&nbsp;crc&nbsp;^&nbsp;((uint)bus_recv_buf[n]&nbsp;&lt;&lt;&nbsp;8);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;8;&nbsp;++i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(crc&nbsp;&amp;0x8000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;=&nbsp;(crc&nbsp;&lt;&lt;&nbsp;1)&nbsp;^&nbsp;0x1021;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;=&nbsp;crc&nbsp;&lt;&lt;&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;&amp;=&nbsp;0x0f0f;<br>&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;|=&nbsp;0x3030; //&nbsp;CRC的字节高4位强制为3<br>&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;=&nbsp;(bus_recv_buf[0]&nbsp;&amp;0x0f); //长度为第1字节去掉高4位<br>&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;=&nbsp;bus_recv_buf[l&nbsp;-&nbsp;2];&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;cl&nbsp;=&nbsp;bus_recv_buf[l&nbsp;-&nbsp;1];&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(crc&nbsp;==&nbsp;(((uint)ch)&nbsp;&lt;&lt;&nbsp;8)&nbsp;+&nbsp;cl)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>我把它改成Delphi,如下:<br><br>type<br>&nbsp;&nbsp;&nbsp;TBytes=array&nbsp;of&nbsp;Byte&nbsp;<br>var<br>&nbsp;&nbsp;&nbsp;ReBuffer:TByte;//接受缓冲区<br>&nbsp;&nbsp;&nbsp;<br><br><br><br>//此函数是网上看到的,顺便拿来用,不知有错误么?---Byte数组转换为integer-------------------<br>function&nbsp;&nbsp;&nbsp;BytesToInteger(const&nbsp;&nbsp;&nbsp;AValue:&nbsp;&nbsp;&nbsp;TBytes):&nbsp;&nbsp;&nbsp;Integer;&nbsp;&nbsp;&nbsp;<br>begin&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;{$IFDEF&nbsp;&nbsp;&nbsp;DotNet}&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;Result&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;&nbsp;System.BitConverter.ToInt32(AValue,&nbsp;&nbsp;&nbsp;0);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;{$ELSE}&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;Result&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;&nbsp;PInteger(@AValue[0])^;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;{$ENDIF}&nbsp;&nbsp;&nbsp;<br>end;<br>//----------------------------------------------------------<br><br>{-------------------------------------------------------<br>长度=第1字节去掉高4位,CRC的字节高4位强制为3<br>函数返回true CRC正确<br>返回false CRC错误<br>--------------------------------------------------------}<br>function&nbsp;Check_RCR():Boolean;<br>var<br>&nbsp;&nbsp;L,n:&nbsp;byte;<br>&nbsp;&nbsp;crc:integer;<br>&nbsp;&nbsp;ch,cl,i:byte;<br>begin<br>&nbsp;&nbsp;result:=false;<br>&nbsp;&nbsp;crc:=$0000;<br>&nbsp;&nbsp;L:=(ReBuffer[0]&nbsp;and&nbsp;$0f)-2;&nbsp;//长度=第1字节去掉高4位<br>&nbsp;&nbsp;for&nbsp;n:=0&nbsp;to&nbsp;L&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;crc:=crc&nbsp;xor&nbsp;(BytesToInteger(ReBuffer[n])&nbsp;shl&nbsp;8);//调用转换函数,这一句有问题,提示说,Byte和Bytes类型不匹配,请问,怎么改?<br>&nbsp;&nbsp;&nbsp;&nbsp;//crc:=crc&nbsp;xor&nbsp;(ReBuffer[n]&nbsp;shl&nbsp;8);<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;7&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(crc&nbsp;and&nbsp;$8000)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc:=((crc&nbsp;shl&nbsp;1)&nbsp;xor&nbsp;$1021)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc:=crc&nbsp;shl&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;//end&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;7&nbsp;do<br>&nbsp;&nbsp;end;//end&nbsp;for&nbsp;n:=0&nbsp;to&nbsp;1&nbsp;do<br>&nbsp;&nbsp;crc:=&nbsp;crc&nbsp;and&nbsp;$0f0f;<br>&nbsp;&nbsp;crc:=&nbsp;crc&nbsp;or&nbsp;$3030;<br>&nbsp;&nbsp;L:=(ReBuffer[0]&nbsp;and&nbsp;$0f);<br>&nbsp;&nbsp;ch:=ReBuffer[L-2];<br>&nbsp;&nbsp;cl:=ReBuffer[L-1];<br>&nbsp;&nbsp;//if&nbsp;(crc=(ch&nbsp;shl&nbsp;8)&nbsp;+&nbsp;cl)&nbsp;then//ch类型转换:byte型怎么转换为integer型?<br>&nbsp;&nbsp;if&nbsp;crc=&nbsp;(ch&nbsp;*256&nbsp;+cl)&nbsp;then//这一句不知可不可以?<br>&nbsp;&nbsp;&nbsp;&nbsp;result:=true<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;result:=false;<br><br>end;<br><br>问题在注释上,我是新手,很多东西不懂,请大家帮我看看吧,如果能够顺便帮我修改修改,小弟将感激不尽!
 
大富翁,没人理??
 

Similar threads

后退
顶部