⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vb下如何编写crc校验程序.htm

📁 计算程序。可以通过它来进行CRC的校验计算。可以将十六进制数转化为十进制数据
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0056)http://vbboshi.myrice.com/vbtech/other/page_2/file44.htm -->
<HTML><HEAD><TITLE>VB下如何编写CRC校验程序</TITLE>
<META content=en-us http-equiv=Content-Language>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<STYLE type=text/css>FONT {
	FONT-SIZE: 9pt; LINE-HEIGHT: 13pt
}
P {
	FONT-SIZE: 9pt; LINE-HEIGHT: 13pt
}
TD {
	FONT-SIZE: 9pt; LINE-HEIGHT: 13pt
}
SELECT {
	FONT-FAMILY: 宋体; FONT-SIZE: 9pt
}
INPUT {
	FONT-FAMILY: 宋体; FONT-SIZE: 9pt
}
TEXTAREA {
	FONT-FAMILY: 宋体; FONT-SIZE: 9pt
}
A {
	COLOR: blue; FONT-SIZE: 9pt; TEXT-DECORATION: none
}
A:hover {
	COLOR: red; TEXT-DECORATION: underline
}
A:active {
	COLOR: red; TEXT-DECORATION: underline
}
</STYLE>
</HEAD>
<BODY bgColor=#feeaa5>
<DIV align=center>
<CENTER>
<TABLE border=0 width="100%">
  <TBODY>
  <TR>
    <TD align=middle width="100%"><FONT 
      color=#ff0000>VB下如何编写CRC校验程序<BR></FONT>作者:栾金奎</TD></TR>
  <TR>
    <TD>  随着计算机技术的不断发展,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。由于传输距离、现场状况等诸多可能出现的因素影响,计算机与受控设备之间的通讯数据常会发生无法预测的错误。为了防止错误所带来的影响,一般在通讯时采取数据校验的办法,而循环冗余码校验是最常用的校验方法之一。<BR><BR>一、 
      循环冗余码校验原理<BR><BR>  循环冗余码校验英文名称为Cyclical Redundancy 
      Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error 
      Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。<BR>根据应用环境与习惯的不同,CRC又可分为以下几种标准:<BR>  ①CRC-12码;<BR>  ②CRC-16码;<BR>  ③CRC-CCITT码;<BR>  ④CRC-32码。<BR>  CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。<BR>下面以最常用的CRC-16为例来说明其生成过程。<BR>  CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。<BR>  下面为CRC的计算过程:<BR>  1.设置CRC寄存器,并给其赋值FFFF(hex)。<BR>  2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。<BR>  3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。<BR>  4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。<BR>  5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。<BR>  6.重复第2至第5步直到所有数据全部处理完成。<BR>  7.最终CRC寄存器的内容即为CRC值。<BR><BR>二、 
      循环冗余码校验程序的编写<BR><BR>  明白了CRC校验码的产生过程,编写起程序来就非常容易了。由于Visual 
      Basic的广泛普及以及其在数据通讯中的重要地位,下面就以VB语言来编写CRC的生成程序,其它语言只需稍做修改即可。<BR>  编写CRC校验程序有两种办法:一种为计算法,一种为查表法。下面对两种方法分别讨论。<BR><BR>  1.计算法<BR>  计算法就是依据CRC校验码的产生原理来设计程序。其优点是模块代码少,修改灵活,可移植性好。其缺点为计算量大。为了便于理解,这里假定了三位数据,而多项式码为A001(hex)。<BR>  在窗体上放置一命令按钮Command1,并添加如下代码:<BR><BR>  Private 
      Sub Command1_Click()<BR>   Dim CRC() As Byte<BR>   Dim d() As Byte 
      '待传输数据<BR>   ReDim d(2) As Byte<BR>   d(0) = 123<BR>   d(1) = 
      112<BR>   d(2) = 135<BR>   CRC = CRC16(d) 
      '调用CRC16计算函数<BR>   'CRC(0)为高位<BR>   'CRC(1)为低位<BR>  End 
      Sub<BR>  注意:在数据传输时CRC的低位可能在前,而高位在后。<BR><BR>  Function CRC16(data() As 
      Byte) As String<BR>   Dim CRC16Lo As Byte, CRC16Hi As 
      Byte   'CRC寄存器<BR>   Dim CL As Byte, CH As 
      Byte        '多项式码&amp;HA001<BR>   Dim SaveHi As Byte, SaveLo As 
      Byte<BR>   Dim i As Integer<BR>   Dim Flag As Integer<BR>   CRC16Lo = 
      &amp;HFF<BR>   CRC16Hi = &amp;HFF<BR>   CL = &amp;H1<BR>   CH = 
      &amp;HA0<BR>   For i = 0 To UBound(data)<BR>    CRC16Lo = CRC16Lo Xor 
      data(i) '每一个数据与CRC寄存器进行异或<BR>    For Flag = 0 To 7<BR>     SaveHi = 
      CRC16Hi<BR>     SaveLo = CRC16Lo<BR>     CRC16Hi = CRC16Hi \ 
      2      '高位右移一位<BR>     CRC16Lo = CRC16Lo \ 2      '低位右移一位<BR>     If 
      ((SaveHi And &amp;H1) = &amp;H1) Then '如果高位字节最后一位为1<BR>      CRC16Lo = 
      CRC16Lo Or &amp;H80   '则低位字节右移后前面补1<BR>     End If              
      '否则自动补0<BR>     If ((SaveLo And &amp;H1) = &amp;H1) Then 
      '如果LSB为1,则与多项式码进行异或<BR>      CRC16Hi = CRC16Hi Xor CH<BR>      CRC16Lo = 
      CRC16Lo Xor CL<BR>     End If<BR>    Next Flag<BR>   Next i<BR>   Dim 
      ReturnData(1) As Byte<BR>   ReturnData(0) = 
      CRC16Hi       'CRC高位<BR>   ReturnData(1) = 
      CRC16Lo       'CRC低位<BR>   CRC16 = ReturnData<BR>  End 
      Function<BR><BR>  2.查表法<BR>  查表法的优缺点与计算法的正好相反。为了便于比较,这里所有的假定与计算法的完全相同,都而在窗体上放置一个Command1的按钮,其代码部分与上面的也完全一致。下面只介绍CRC函数的编写源代码。<BR><BR>  Private 
      Function CRC16(data() As Byte) As String<BR>   Dim CRC16Hi As 
      Byte<BR>   Dim CRC16Lo As Byte<BR>   CRC16Hi = &amp;HFF<BR>   CRC16Lo = 
      &amp;HFF<BR>   Dim i As Integer<BR>   Dim iIndex As Long<BR>   For i = 0 
      To UBound(data)<BR>    iIndex = CRC16Lo Xor data(i)<BR>    CRC16Lo = 
      CRC16Hi Xor GetCRCLo(iIndex)    '低位处理<BR>    CRC16Hi = 
      GetCRCHi(iIndex)          '高位处理<BR>   Next i<BR>   Dim ReturnData(1) As 
      Byte<BR>   ReturnData(0) = CRC16Hi    'CRC高位<BR>   ReturnData(1) = 
      CRC16Lo    'CRC低位<BR>   CRC16 = ReturnData<BR>  End 
      Function<BR><BR>  'CRC低位字节值表<BR>  Function GetCRCLo(Ind As Long) As 
      Byte<BR>   GetCRCLo = Choose(Ind + 1, &amp;H0, &amp;HC1, &amp;H81, 
      &amp;H40, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H1, &amp;HC0, 
      &amp;H80, &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, 
      &amp;HC0, &amp;H80, &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, 
      &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, 
      &amp;H41, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H0, &amp;HC1, 
      &amp;H81, &amp;H40, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, 
      &amp;HC0, &amp;H80, &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, 
      &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H1, &amp;HC0, &amp;H80, 
      &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, 
      &amp;H80, &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H0, 
      &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, 
      &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, 
      &amp;H41, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H0, &amp;HC1, 
      &amp;H81, &amp;H40, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, 
      &amp;HC0, &amp;H80, &amp;H41, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, 
      &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, 
      &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H0, &amp;HC1, 
      &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H1, 
      &amp;HC0, _<BR>&amp;H80, &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, 
      &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, 
      &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, 
      &amp;H80, &amp;H41, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H0, 
      &amp;HC1, &amp;H81, &amp;H40, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, 
      &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H1, &amp;HC0, &amp;H80, 
      &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, 
      &amp;H80, &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H0, 
      &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, 
      &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, 
      &amp;H41, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H0, &amp;HC1, 
      &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H0, 
      &amp;HC1, &amp;H81, &amp;H40, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, 
      &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H1, &amp;HC0, &amp;H80, 
      &amp;H41, &amp;H0, &amp;HC1, &amp;H81, &amp;H40, &amp;H0, &amp;HC1, 
      &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H0, 
      &amp;HC1, &amp;H81, &amp;H40, &amp;H1, &amp;HC0, &amp;H80, &amp;H41, 
      &amp;H1, &amp;HC0, &amp;H80, &amp;H41, &amp;H0, &amp;HC1, &amp;H81, 
      &amp;H40)<BR>  End Function<BR><BR>  'CRC高位字节值表<BR>  Function GetCRCHi(Ind 
      As Long) As Byte<BR>   GetCRCHi = Choose(Ind + 1, &amp;H0, &amp;HC0, 
      &amp;HC1, &amp;H1, &amp;HC3, &amp;H3, &amp;H2, &amp;HC2, &amp;HC6, 
      &amp;H6, &amp;H7, &amp;HC7, &amp;H5, &amp;HC5, &amp;HC4, &amp;H4, 
      &amp;HCC, &amp;HC, &amp;HD, &amp;HCD, &amp;HF, &amp;HCF, &amp;HCE, 
      &amp;HE, &amp;HA, &amp;HCA, &amp;HCB, &amp;HB, &amp;HC9, &amp;H9, &amp;H8, 
      &amp;HC8, &amp;HD8, &amp;H18, &amp;H19, &amp;HD9, &amp;H1B, &amp;HDB, 
      &amp;HDA, &amp;H1A, &amp;H1E, &amp;HDE, &amp;HDF, &amp;H1F, &amp;HDD, 
      &amp;H1D, &amp;H1C, &amp;HDC, &amp;H14, &amp;HD4, &amp;HD5, &amp;H15, 
      &amp;HD7, &amp;H17, &amp;H16, &amp;HD6, &amp;HD2, &amp;H12, &amp;H13, 
      &amp;HD3, &amp;H11, &amp;HD1, &amp;HD0, &amp;H10, &amp;HF0, &amp;H30, 
      &amp;H31, &amp;HF1, &amp;H33, &amp;HF3, &amp;HF2, &amp;H32, &amp;H36, 
      &amp;HF6, &amp;HF7, &amp;H37, &amp;HF5, &amp;H35, &amp;H34, &amp;HF4, 
      &amp;H3C, &amp;HFC, &amp;HFD, &amp;H3D, &amp;HFF, &amp;H3F, &amp;H3E, 
      &amp;HFE, &amp;HFA, &amp;H3A, &amp;H3B, &amp;HFB, &amp;H39, &amp;HF9, 
      &amp;HF8, &amp;H38, &amp;H28, &amp;HE8, &amp;HE9, &amp;H29, &amp;HEB, 
      &amp;H2B, &amp;H2A, &amp;HEA, &amp;HEE, &amp;H2E, &amp;H2F, &amp;HEF, 
      &amp;H2D, &amp;HED, &amp;HEC, &amp;H2C, &amp;HE4, &amp;H24, &amp;H25, 
      &amp;HE5, &amp;H27, &amp;HE7, &amp;HE6, &amp;H26, &amp;H22, &amp;HE2, 
      &amp;HE3, &amp;H23, &amp;HE1, &amp;H21, &amp;H20, &amp;HE0, &amp;HA0, 
      &amp;H60, _<BR>&amp;H61, &amp;HA1, &amp;H63, &amp;HA3, &amp;HA2, &amp;H62, 
      &amp;H66, &amp;HA6, &amp;HA7, &amp;H67, &amp;HA5, &amp;H65, &amp;H64, 
      &amp;HA4, &amp;H6C, &amp;HAC, &amp;HAD, &amp;H6D, &amp;HAF, &amp;H6F, 
      &amp;H6E, &amp;HAE, &amp;HAA, &amp;H6A, &amp;H6B, &amp;HAB, &amp;H69, 
      &amp;HA9, &amp;HA8, &amp;H68, &amp;H78, &amp;HB8, &amp;HB9, &amp;H79, 
      &amp;HBB, &amp;H7B, &amp;H7A, &amp;HBA, &amp;HBE, &amp;H7E, &amp;H7F, 
      &amp;HBF, &amp;H7D, &amp;HBD, &amp;HBC, &amp;H7C, &amp;HB4, &amp;H74, 
      &amp;H75, &amp;HB5, &amp;H77, &amp;HB7, &amp;HB6, &amp;H76, &amp;H72, 
      &amp;HB2, &amp;HB3, &amp;H73, &amp;HB1, &amp;H71, &amp;H70, &amp;HB0, 
      &amp;H50, &amp;H90, &amp;H91, &amp;H51, &amp;H93, &amp;H53, &amp;H52, 
      &amp;H92, &amp;H96, &amp;H56, &amp;H57, &amp;H97, &amp;H55, &amp;H95, 
      &amp;H94, &amp;H54, &amp;H9C, &amp;H5C, &amp;H5D, &amp;H9D, &amp;H5F, 
      &amp;H9F, &amp;H9E, &amp;H5E, &amp;H5A, &amp;H9A, &amp;H9B, &amp;H5B, 
      &amp;H99, &amp;H59, &amp;H58, &amp;H98, &amp;H88, &amp;H48, &amp;H49, 
      &amp;H89, &amp;H4B, &amp;H8B, &amp;H8A, &amp;H4A, &amp;H4E, &amp;H8E, 
      &amp;H8F, &amp;H4F, &amp;H8D, &amp;H4D, &amp;H4C, &amp;H8C, &amp;H44, 
      &amp;H84, &amp;H85, &amp;H45, &amp;H87, &amp;H47, &amp;H46, &amp;H86, 
      &amp;H82, &amp;H42, &amp;H43, &amp;H83, &amp;H41, &amp;H81, &amp;H80, 
      &amp;H40)<BR>  End 
Function<BR><BR>  以上程序在Win98,VB6下调试通过。</TD></TR></TBODY></TABLE></CENTER></DIV>
<TABLE border=0 cellPadding=0 cellSpacing=0 height=77 width="100%">
  <TBODY>
  <TR>
    <TD height=55 width="100%">
      <P align=center><A href="http://www.vbeden.com/" 
      target=_blank>VB编程乐园</A>版权所有<FONT color=#000080>&copy;,1999-2000</FONT><FONT 
      color=#008000>
      <SCRIPT>document.write("<a href=http://www.topcn.com/siteinfo.asp?UserName=vbeden&SiteType=0 target=_blank><img src=http://www1.topcn.com:8081/statistics.asp?vbeden&referURL="+escape(top.document.referrer)+"&curURL="+escape(top.document.URL)+"&imgStyle=0"+" width=1 height=1 border=0 alt='Top中文网站龙虎榜' ></a>");</SCRIPT>
      </FONT><FONT color=#000080><BR></FONT>网页设计制作:<FONT color=#000080><A 
      href="mailto:vbeden@21cn.com">木子</A></FONT></P></TD></TR>
  <TR>
    <TD height=22 width="100%">
      <P align=center>
      <SCRIPT>var tc_user="vbboshi";var tc_class="2";</SCRIPT>

      <SCRIPT src="VB下如何编写CRC校验程序.files/stat.js"></SCRIPT>
      </P></TD></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -