vb下如何编写CRC校验程序
一、循环冗余校验原理
循环冗余码的英文名称是循环冗余校验,简称CRC,它采用除法和余数原理进行错误检测(错误检测),当应用时,发送设备计算CRC值并连同数据一起发送到接收设备。接收装置接收到的数据重新计算CRC,它与接收到的CRC比较。如果两个CRC值不同,则发生数据通信错误。
根据不同的应用环境和习惯,CRC可分为以下标准:
(1)crc-12代码;
(2)CRC-16码;
(3)校验码;
(4)CRC-32编码。
crc-12码通常用于传输位strings.crc-16和CRC-CCITT码用于发送8位字符,其中CRC-16在美国使用,并由欧洲countries.crc-32 CRC-CCITT码主要用于同步传输称为点对点。
以下是最常用的CRC-16为例来说明其产生的过程。
CRC-16码由两个字节,在CRC开始登记每个预置为1,然后华润登记和8位数据异或CRC登记后,从高到低的顶端水平位移(MSB)零的位置,和最低(LSB,转移了CRC从登记册中删除)如果1,与预定义的多项式码或者如果LSB是零登记,无需异或。重复上述转变,从高到低8倍,第一位的数据进行处理,然后使用CRC登记价值的同时,开展8班喜欢在下8位数据或以前的数据。毕竟字符处理完成后,在华润登记的价值是最终的CRC值。
下面是CRC的计算:
1。设置CRC登记并分配一个值(HEX)FFFF。
2。数据的第一个8位字符与16位CRC寄存器的低8位无关,结果存储在CRC寄存器中。
的3.crc登记移动到另一个点的权利,高位补零,搬出去和检查的LSB。
4。如果LSB为0,重复第三步;如果LSB为1,CRC寄存器与多项式代码不同。
5。用第四步重复第三,直到8个转换完成。此时,完成8位数据处理。
6。重复第二到第五步直到所有数据被处理。
7。最终CRC寄存器的内容是CRC值。
二、循环冗余码校验程序的编写
为了理解CRC校验码的生成过程,编写程序非常容易,由于VB的普及及其在数据通信中的重要地位,我们将用VB语言编写CRC校验程序。
编写CRC校验程序有两种方法:一种是计算方法,另一种是查表法,分别讨论了两种方法。
1。计算方法
计算方法是根据CRC校验码的生成原理设计的程序,优点是模块代码很少,修改灵活,且可移植性好,其缺点是计算量大,为了理解,三位数据是假设的,和多项式代码是A001(HEX)。
放置一个命令按钮command1的形式,并添加以下代码:
私有子command1_click()
将CRC()变为字节
将d()作为发送数据的字节
ReDim D(2)字节
d(0)=123
D(1)= 112
d(2)=135
CRC CRC16(D)呼叫CRC16计算功能
CRC(0)很高
CRC(1)很低
端子
注意:CRC的低位可能在数据传输之前,高位位置在后面。
功能CRC16(数据()字节)为字符串
昏暗的crc16lo字节,字节的CRC crc16hi登记
昏暗的CL为字节,字节码多项式假日001的CH
昏暗的savehi字节,SaveLo As Byte
模糊i为整数
标志为整数
crc16lo = HFF
crc16hi = HFF
CL = H1
CH = 0
我= 0,UBound(数据)
crc16lo = crc16lo异或数据(我)的每个数据不同于CRC登记
对于标志= 0到7
savehi = crc16hi
crc16lo Savelo =
crc16hi = crc16hi 2高右移位
crc16lo = crc16lo 2低右移位
如果((SaveHi和H1)= H1)然后如果高字节的最后一位是1
crc16lo = crc16lo或H80然后低位字节右移提前1
如果否则自动填充0
如果(((SaveLo和H1)= H1)然后如果LSB为1,则多项式编码不同或。
crc16hi = crc16hi异或CH
crc16lo = crc16lo异或CL
最后如果
下一个标志
下一个我
昏暗的returndata(1)字节
returndata(0)= crc16hi的CRC高
returndata(1)= crc16lo的CRC低
returndata CRC16 =
端功能
2。查表法
The merits and demerits of the look-up table method are the opposite of the calculation method.For comparison purposes, all the assumptions here are exactly the same as the calculation method, and the Command1 button is placed on the form. 代码部分也与上面的内容一致。下面是编写CRC函数的源代码。
私有函数CRC16(数据()字节)为字符串
crc16hi字节暗淡
昏暗的crc16lo字节
crc16hi = HFF
crc16lo = HFF
模糊i为整数
昏暗的指数一样长
我= 0,UBound(数据)
指数= crc16lo异或数据(我)
crc16lo = crc16hi异或getcrclo(指数)的低位处理
crc16hi = getcrchi(指数)的处理
下一个我
昏暗的returndata(1)字节
returndata(0)= crc16hi的CRC高
returndata(1)= crc16lo的CRC低
returndata CRC16 =
端功能
CRC低字节字节值表
功能getcrclo(Ind时间)为字节
GetCRCLo = Choose(Ind + 1, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, _
H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40, H0, HC1, H81, H40, H1, HC0, H80, H41, H0, HC1, H81, H40, H1, HC0, H80, H41, H1, HC0, H80, H41, H0, HC1, H81, H40)
端功能
CRC高字节值表
函数的GetCRCHi(Ind时间)为字节
GetCRCHi = Choose(Ind + 1, H0, HC0, HC1, H1, HC3, H3, H2, HC2, HC6, H6, H7, HC7, H5, HC5, HC4, H4, HCC, HC, HD, HCD, HF, HCF, HCE, HE, HA, HCA, HCB, HB, HC9, H9, H8, HC8, HD8, H18, H19, HD9, H1B, HDB, HAD, H1A, H1E, HDE, HDF, H1F, HDD, H1D, H1C, HDC, H14, HD4, HD5, H15, HD7, H17, H16, HD6, HD2, H12, H13, HD3, H11, HD1, HD0, H10, HF0, H30, H31, HF1, H33, HF3, HF2, H32, H36, HF6, HF7, H37, HF5, H35, H34, HF4, H3C, HFC, HFD, H3D, HFF, H3F, H3E, HFE, HFA, H3A, H3B, HFB, H39, HF9, HF8, H38, H28, HE8, HE9, H29, HEB, H2B, H2A, HEA, HEE, H2E, H2F, HEF, H2D, HED, HEC, H2C, HE4, H24, H25, HE5, H27, HE7, HE6, H26, H22, HE2, HE3, H23, HE1, H21, H20, HE0, HA0, H60, _
H61, HA1, H63, HA3, HA2, H62, H66, HA6, HA7, H67, HA5, H65, H64, HA4, H6C, HAC, HAD, H6D, HAF, H6F, H6E, HAE, HAA, H6A, H6B, HAB, H69, HA9, HA8, H68, H78, HB8, HB9, H79, HBB, H7B, H7A, HBA, HBE, H7E, H7F, HBF, H7D, HBD, HBC, H7C, HB4, H74, H75, HB5, H77, HB7, HB6, H76, H72, HB2, HB3, H73, HB1, H71, H70, HB0, H50, H90, H91, H51, H93, H53, H52, H92, H96, H56, H57, H97, H55, H95, H94, H54, H9C, H5C, H5D, H9D, H5F, H9F, H9E, H5E, H5A, H9A, H9B, H5B, H99, H59, H58, H98, H88, H48, H49, H89, H4B, H8B, H8A, H4A, H4E, H8E, H8F, H4F, H8D, H4D, H4C, H8C, H44, H84, H85, H45, H87, H47, H46, H86, H82, H42, H43, H83, H41, H81, H80, H40)
端功能
上面的程序进行了调试和Win98和VB6通过。