CRC校验汇编与VB子程

合集下载

VB下如何编写CRC校验程序

VB下如何编写CRC校验程序

VB下如何编写CRC校验程序在VB编程语言中编写CRC校验程序有多种方法。

下面是一种使用VB 的示例代码,用于计算32位CRC校验和。

首先,我们需要定义一个函数来计算CRC校验和。

以下是一个示例函数:```vbFunction CalculateCRC32(ByVal data As String) As String' CRC32 lookup tableDim table(255) As LongDim crc As LongDim i As Long, j As Long' Generate CRC32 lookup tableFor i = 0 To 255crc = iFor j = 0 To 7If crc And 1 ThenElsecrc = crc \ 2End IfNext jtable(i) = crcNext i' Calculate CRC32 checksumcrc = &HFFFFFFFFFor i = 1 To Len(data)crc = table((crc Xor Asc(Mid(data, i, 1))) And 255) Xor ((crc And &HFFFFFF00) \ &H100)Next icrc = crc Xor &HFFFFFFFF' Convert CRC32 checksum to hexadecimal stringEnd Function```以上的函数使用了CRC32查找表来加快计算速度。

函数接受一个字符串作为输入,并返回计算出的CRC32校验和,以16进制字符串形式返回。

接下来,可以在主程序中调用该函数来计算CRC校验和。

以下是一个示例:```vbSub MainDim data As StringDim crc As String'输入需要计算校验和的数据data = "Hello World!"'计算CRC32校验和crc = CalculateCRC32(data)'显示结果MsgBox "CRC32校验和: " & crc, vbInformationEnd Sub```在上述示例中,我们定义了一个名为`Main`的子程序,该程序首先要求用户输入要计算CRC校验和的数据,然后调用`CalculateCRC32`函数计算CRC32校验和,并使用`MsgBox`函数显示结果。

CRC校验VB示例程序.doc

CRC校验VB示例程序.doc

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''使用CommandButton控件调用一个函数'' '''' ''''进行CRC校检'' '' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Private Sub compute_CRC_Click()Dim BCRC%, GP&, BDF& '定义一个整型两个长整型变量'BCRC--->CRC的位数目'GP --->生成多项式generationPolynomial 校验用的除数'BDF --->待校验的数据块的十进制表示'Integer % 整型'Long & 长整型'Single ! 单精度'Double # 双精度'Currency @ 货币'String $ 字符串BCRC = 16 '采用的是CRC-16校验'生成多项式g(2)=2^16+2^12+2^5+1 即1 0001 0000 0001 0001'F*2^16=A*G+CGP = Val("&H" & CStr(genPoly_outPut.Text) & "&") '转成十六进制字符串后再转成十进制数BDF = Val("&H" & CStr(dataBlock_outPut.Text) & "&") '同上CRCValue_outPut.Text = Hex(CalCRC(BCRC, GP, BDF)) '将计算的结果转为十六进制字符串输出End SubFunction CalCRC(BCRC_RX As Integer, GP_RX As Long, BDF_RX As Long) As LongDim C1&, C2&Dim A1%, PreC1&Dim LeftValue%, AlShift%If BDF_RX = 0 ThenCalCRC = 0Exit FunctionEnd IfA1 = (Len(Hex(BDF_RX)) - 1) * 4 '除数比被除数差多少位除数就要向左移多少位位数一样才能做Xor运算嘛'这个相差的位数由两部分组成'这里计算的是第一部分C1 = BDF_RX * 2 ^ BCRC_RXLeftValue = Val("&H" & Mid(Hex(BDF_RX), 1, 1))If LeftValue >= 1 Then AlShift = 1 '这里就是第二部分If LeftValue >= 2 Then AlShift = 2 '同上If LeftValue >= 4 Then AlShift = 3 '同上If LeftValue >= 8 Then AlShift = 4 '同上A1 = A1 + (AlShift - 1)C2 = GP_RX * 2 ^ A1DoPreC1 = C1 '先把C1备个份如果下步的Xor不是我们想要的就可以用备份的数据重新XORC1 = C1 Xor C2 '不管C2是不是合适先算一次再说C2如果不合适C1就应该与C2右移数位后的数据进行XorDoA1 = A1 - 1If C1 > PreC1 Then '检查C1的值以便确定上一步Xor运算中C2是否是合适的值C1 = PreC1 Xor GP_RX * 2 ^ A1ElseExit DoEnd IfLoopC2 = GP_RX * 2 ^ A1 '每次C2向右移一位甚至更多Loop Until C1 < GP_RX '余数比除数小的时候结果就出来了CalCRC = C1 'C1就是最终的CRC校验码先从函数返回这个值最后再转成十六进制End Function。

用VB编写的Modbus通讯CRC16校验程序

用VB编写的Modbus通讯CRC16校验程序

用VB编写的Modbus通讯CRC16校验程序(2007-09-27 21:48:19)转载▼标签:IT/科技Rem 声明CRC16冗余校验函数ACS510_CRCPrivate Declare Function ACS510_CRC Lib "ACS510.dll" (ByVal a As Long, ByVal a As Long) As LongPublic Function ACS510_Cmd(ByVal StationID As Long, ByVal WRcmd As Long, ByVal WRAddress As Long, ByVal Data As Long) As StringDim StatID AsString'定义从机地址缓存区Dim Cmd AsString'定义功能命令缓存区Dim Address AsString'定义读写地址缓存区Dim WRAddressHi AsString'定义读写地址的高半字节缓存区Dim WRAddressLo AsString'定义读写地址的低半字节缓存区Dim hData AsString'定义读写数据缓存区Dim DataHi AsString'定义读写数据高半字节缓存区Dim DataLo AsString'定义读写数据低半字节缓存区Dim CRCBuffer1 AsString'定义从机地址校验缓存区Dim CRCBuffer2 AsString'定义命令校验缓存区Dim CRCBuffer3 AsString'定义读写地址高字节校验缓存区Dim CRCBuffer4 AsString'定义读写地址低字节校验缓存区Dim CRCBuffer5 AsString'定义读写数据高半字节校验缓存区Dim CRC AsString'定义读写数据低半字节校验缓存区(也即是CRC计算的最后结果)Dim CRCHi AsString'定义校验高半字节缓存区Dim CRCLo AsString'定义校验低半字节缓存区Dim CRC_Even AsString'定义校验结果取反缓存区Rem 取从机的地址StatID = Trim(Hex(StationID))If StatID = "" ThenMsgBox "目的地地址不能为空!", vbInformation + vbOKOnly, "系统提示!"Exit FunctionElseIf Len(StatID) = 1 ThenStatID = "0" + StatIDEnd IfIf Len(StatID) >= 2 ThenStatID = Trim(Right(StatID, 2))End IfEnd IfRem 取读写命令Cmd = Trim(Hex(WRcmd))If Cmd = "" ThenMsgBox "读写命令不能为空!", vbInformation + vbOKOnly, "系统提示!"Exit FunctionElseIf Len(Cmd) = 1 ThenCmd = "0" + CmdEnd IfIf Len(Cmd) >= 2 ThenCmd = Trim(Right(Cmd, 2))End IfEnd IfRem 取读写数据的地址Address = Trim(Tran_Format(Trim(Hex(WRAddress))))WRAddressHi = Trim(Mid$(Address, 1, 2))WRAddressLo = Trim(Mid$(Address, 3, 2))Rem 取读写的数据(读时为字节数,写时为要写的数据)hData = Trim(Tran_Format(Trim(Hex(Data))))DataHi = Trim(Mid$(hData, 1, 2))DataLo = Trim(Mid$(hData, 3, 2))Rem 计算从机地址的校验CRCBuffer1 = ACS510_CRC(65535, StationID)Rem 计算读写命令的校验CRCBuffer2 = ACS510_CRC(CRCBuffer1, WRcmd)Rem 计算读写地址高半字节的校验If ReadAddressHi = "00" ThenReadAddressHi = ""CRCBuffer3 = CRCBuffer2ElseCRCBuffer3 = ACS510_CRC(CRCBuffer2, Tran_HD(WRAddressHi)) End IfRem 计算读写地址低半字节的校验CRCBuffer4 = ACS510_CRC(CRCBuffer3, Tran_HD(WRAddressLo))Rem 计算读写数据高半字节的校验If DataHi = "00" ThenCRCBuffer5 = CRCBuffer4DataHi = ""ElseCRCBuffer5 = ACS510_CRC(CRCBuffer4, Tran_HD(DataHi)) End IfRem 计算读写数据低半字节的校验,既最终的校验CRC = Trim(Tran_Format(Hex(ACS510_CRC(CRCBuffer5,Tran_HD(DataLo)))))Rem 取校验的高半字节CRCHi = Trim(Mid$(CRC, 1, 2))Rem 取校验的低半字节CRCLo = Trim(Mid$(CRC, 3, 2))Rem 重新组合校验的结果CRC_Even = CRCLo + CRCHiRem 返回发送字符串ACS510_Cmd = StatID + Cmd + WRAddressHi + WRAddressLo + DataHi + DataLo + CRC_EvenEnd Function。

crc校验原理及步骤

crc校验原理及步骤

crc校验原理及步骤嘿,咱今儿就来聊聊这 CRC 校验!你说这 CRC 校验啊,就像是给数据穿上了一件特别的“保护衣”。

它的原理呢,其实挺有意思。

就好像我们要识别一群人里有没有冒牌货,得有个特别的办法来判断。

CRC 校验就是通过一种特定的计算方式,给数据生成一个独一无二的“标记”。

那具体步骤是咋样的呢?首先啊,得选个合适的生成多项式,这就好比选一把合适的钥匙。

然后呢,把要校验的数据当成宝贝一样,和这个生成多项式一起进行一番奇妙的运算。

这运算过程啊,就像是一场数据的舞蹈,各种数字在里面蹦跶、组合。

等这舞蹈结束,就得到了一个校验码。

这个校验码可重要啦,就像人的身份证号一样,能证明数据的身份。

当数据要传输或者存储的时候,就把这个校验码也带上。

等数据到了目的地,接收方再按照同样的步骤来一次,看看算出来的校验码和带来的一不一样。

如果一样,那就说明数据在旅途中没出啥问题,完好无损地到达啦!要是不一样呢,哎呀,那可就麻烦啦,说明数据可能在途中遭遇了什么“小意外”,得赶紧找找问题出在哪儿。

你想想,要是没有这 CRC 校验,那数据在传输过程中出了错都不知道呢!这就好像我们寄个重要包裹,没有保价一样,心里多不踏实呀!CRC 校验在很多地方都大显身手呢!比如在通信领域,它能确保信息准确无误地传达;在计算机存储中,它能保证数据的可靠性。

它就像一个默默无闻的守护者,时刻守护着数据的安全。

所以啊,可别小瞧了这 CRC 校验,它虽然听起来有点复杂,但作用可大着呢!它就像是数据世界里的一位忠诚卫士,为我们的数据保驾护航,让我们能安心地使用和传输数据。

你说是不是很厉害呢?。

如何在VB中编写CRC校验程序

如何在VB中编写CRC校验程序

如何在VB中编写CRC校验程序
在VB中编写CRC校验程序,可以通过以下步骤来实现:
1.了解CRC校验算法:
CRC(Cyclic Redundancy Check)校验是一种常见的错误检测机制,
通过对数据进行计算生成固定长度校验码来验证数据的完整性。

CRC校验
算法使用生成多项式来计算校验码,具体的生成多项式由所使用的CRC标
准决定。

2.导入系统命名空间:
3.创建CRC校验类:
在VB中,可以创建一个类来封装CRC校验的相关操作。

可以定义该
类的属性来存储生成多项式等信息,以及定义方法来执行CRC校验。

4.实现CRC校验方法:
根据CRC校验算法,可以实现一个方法来计算数据的校验码。

具体步
骤如下:
-准备一个数据缓冲区,将待校验的数据按照一定的规则放入缓冲区。

-根据生成多项式,对缓冲区中的数据进行逐位运算,得到校验码。

-返回校验码。

5.调用CRC校验方法:
在主程序中,可以实例化CRC校验类,并调用其中的方法来进行校验。

将待校验的数据作为参数传递给校验方法,获取校验码。

6.完善错误处理:
在代码中需要加入适当的错误处理机制,以捕捉可能出现的异常情况,并给出相应的提示或处理方法。

综上所述,以上是在VB中编写CRC校验程序的基本实现步骤。

具体
的代码实现可以从以下几个方面来展开:导入命名空间、创建CRC校验类、实现CRC校验方法、调用CRC校验方法、错误处理和测试验证等。

编写时
需要根据具体的应用场景和需求来确定具体的实现细节和功能。

CRC校验实现的过程说明

CRC校验实现的过程说明

CRC校验实现的过程说明
1.确定生成多项式
在CRC校验中,首先需要确定生成多项式。

生成多项式是一个二进制数,最高位和最低位分别为1,中间可以是任意二进制数。

生成多项式的
不同取值对应着不同的CRC校验算法。

常用的生成多项式有CRC-8、CRC-
16和CRC-32等。

2.初始化寄存器
3.数据处理
将待校验的数据按照二进制方式表示,并将每一位依次输入到计算寄
存器。

这样,整个待校验的数据就可以被寄存器包含。

4.CRC计算
通过移位异或的方式进行CRC计算。

移位是将寄存器的所有位向左移
一位,同时将输入位移入最低位。

异或是对于多项式中为1的位,如果寄
存器的对应位为1,则结果为0,否则结果为1、通过多次移位异或操作,直到所有位都处理完毕。

5.输出校验值
当所有位都处理完毕后,寄存器中的值即为校验值。

这个校验值可以
附加在数据传输的末尾。

接收方在接收到数据后,进行相同的校验操作,
如果计算出的校验值与接收到的校验值相同,说明传输过程没有发生错误。

然而,CRC校验也有一些限制。

它只能检测错误的存在,不能提供错
误的位置信息。

此外,CRC校验是一种线性校验方法,无法检测出所有的
双位错误。

综上所述,CRC校验实现的过程是通过生成多项式、初始化寄存器、数据处理、CRC计算和输出校验值来完成的。

它是一种简单、快速和可靠的检错技术,在数据传输中得到广泛应用。

crc16校验 用VB编写的CRC校验程序

crc16校验 用VB编写的CRC校验程序

用VB编写的CRC校验程序Private Sub Command1_Click()Dim bcrc%, gp&, bdf& bcrc值为整型, gp值为长整型, bdf值为长整型bcrc = 16 用CRC—16位校验gp = V al("&H" & CStr(Text2.Text) & "&") gp为生成多项式缺省为11021(16进制)bdf = Val("&H" & CStr(Text1.Text) & "&") bdf为原值Text3 = Hex(calcrc(bcrc, gp, bdf)) 为生成的CRC值End SubFunction calcrc(bcrc As Integer, gp As Long, bdf As Long) As LongDim c1&, c2&Dim a1%, prec1&Dim leftvalue%, a1shift%If bdf = 0 Thencalcrc = 0Exit FunctionEnd Ifa1 = (Len(Hex(bdf)) - 1) * 4 a1 ={原值(16进制)的字符数目-1}*4c1 = bdf * 2 ^ bcrc 进行异或运行前,把原值(2进制)后面加16个0leftvalue = Val("&H" & Mid(Hex(bdf), 1, 1)) 原值的左边第1位(最高位)数值(16进制)If leftvalue >= 1 Then a1shift = 1 原值的最高位=1 偏差=1If leftvalue >= 2 Then a1shift = 2 原值的最高位=2或3 偏差=2If leftvalue >= 4 Then a1shift = 3 原值的最高位>=4,<=7 偏差=3If leftvalue >= 8 Then a1shift = 4 原值的最高位>=8 偏差=4a1 = a1 + (a1shift - 1) 原值(后面加16个0)与生成多项式的二进制码的个数差c2 = gp * 2 ^ a1 把生成多项式的后面也相应加a1个0Doprec1 = c1c1 = c1 Xor c2 原值与生成多项式进行异或Doa1 = a1 – 1 a1数值减1If c1 > prec1 Then 如果异或的结果大于原值,说明原值的左边第1位(最高位)为0 c1 = prec1 Xor (gp * 2 ^ a1) 把a1的值减少一位后,继续异或ElseExit DoEnd IfLoopc2 = gp * 2 ^ a1Loop Until c1 <= gp 直至异或的结果小于生成多项式calcrc = c1 所得的异或结果即是CRC值End Function。

CRC检验原理及程序实现

CRC检验原理及程序实现

CRC检验原理及程序实现引言:循环冗余检验CRC(Cyclic Redundancy Check)的检错技术应用较为广泛,由于实际的通信线路并非是理想的,它不可能将误码率(在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER )下降到零。

因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用检错措施。

目前在数据链路中广泛采用循环冗余检验CRC检测技术。

1循环冗余检验CRC的原理利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的n位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+n位,然后发送出去。

在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。

这个规则,在差错控制理论中称为“生成多项式。

代数学的一般性算法:在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。

例如1100101表示为1 • x6+1 • x5+0 • x4+0 • x3+1 • x2+0 • x+1,即x6+x5+x2+1。

设编码前的原始信息多项式为G(x), G(x)的最高幕次加1等于k;生成多项式为P(x),P(x)的最高幕次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。

发送方编码方法:将G (x)乘以xr(即对应的二进制码序列左移r位),再除以P (x),所得余式即为R(x)。

用公式表示为T(x)=xr G (x)+R(x)接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。

2、循环冗余码的产生及正确性检验的例子举例来说,设信息码为101001,生成多项式为1101,即P(x)=x3+x2+1, G(x)=x5+x3+1,计算CRC的过程为xrP(x)即左移三位101001000P (x) =x 3+x2+1 即R(x)= 1。

CRC校验程序

CRC校验程序

最近在做CRC校验的实验,参考了一些资料,最后得出了自己的方法,并编写了以下程序,希望能够对大家起到一定的帮助作用!简要的工作原理描述如下:1,如果原来的CRC最高位异或输入是0的话(既CRC最高位与校验的信息位相同),那么结果就是使CRC左移一位;2, 如果原来的CRC最高位异或输入是1的话(既CRC最高位与校验的信息位不同),那么结果就是先使CRC左移一位,再异或生成的多项式。

记住这两点就可以编写程序了。

首先介绍8位权,多项式CRC8=X8+X5+X4+1,其简化式为0x31;unsigned char crc8(uchar *ptr,uchar len) // ptr 为数据指针,len 为数据长度,发送程序{while(len--){i=0x80;while(i!=0){if(((crc&0x80)!= 0) && ((*ptr)&i)!= 0) //CRC最高位为1且校验bit为1{crc <<= 1;}else if(((crc&0x80)!= 0) && ((*ptr)&i) == 0) //CRC最高位为1且校验bit为0{crc <<= 1;crc ^= 0x31;}else if(((crc&0x80) == 0) && ((*ptr)&i)!= 0) //CRC最高位为0且校验bit为1{crc <<= 1;crc ^= 0x31;}else if(((crc&0x80) == 0) && ((*ptr)&i) == 0) //CRC最高位为0且校验bit为0{crc <<= 1;}i >>= 1;}ptr++;}return(crc);}其次再介绍16位权,多项式CRC-CCITT=X16+X12+X5+1,其简化式为0x1021。

用VB编写的Modbus通讯CRC16校验程序

用VB编写的Modbus通讯CRC16校验程序

用VB编写的Modbus通讯CRC16校验程序用VB编写的Modbus通讯CRC16校验程序(2007-09-27 21:48:19)转载▼标签:IT/科技Rem 声明CRC16冗余校验函数ACS510_CRCPrivate Declare Function ACS510_CRC Lib "ACS510.dll" (ByVal a As Long, ByVal a As Long) As LongPublic Function ACS510_Cmd(ByVal StationID As Long, ByVal WRcmd As Long, ByVal WRAddress As Long, ByVal Data As Long) As StringDim StatID As String '定义从机地址缓存区Dim Cmd As String '定义功能命令缓存区Dim Address As String '定义读写地址缓存区Dim WRAddressHi As String '定义读写地址的高半字节缓存区Dim WRAddressLo As String '定义读写地址的低半字节缓存区Dim hData As String '定义读写数据缓存区Dim DataHi As String '定义读写数据高半字节缓存区Dim DataLo As String '定义读写数据低半字节缓存区Dim CRCBuffer1 As String '定义从机地址校验缓存区Dim CRCBuffer2 As String '定义命令校验缓存区Dim CRCBuffer3 As String '定义读写地址高字节校验缓存区Dim CRCBuffer4 As String '定义读写地址低字节校验缓存区Dim CRCBuffer5 As String '定义读写数据高半字节校验缓存区Dim CRC As String '定义读写数据低半字节校验缓存区(也即是CRC计算的最后结果)Dim CRCHi As String '定义校验高半字节缓存区Dim CRCLo As String '定义校验低半字节缓存区Dim CRC_Even As String '定义校验结果取反缓存区Rem 取从机的地址StatID = Trim(Hex(StationID))If StatID = "" ThenMsgBox "目的地地址不能为空!", vbInformation + vbOKOnly, "系统提示!"Exit FunctionElseIf Len(StatID) = 1 ThenStatID = "0" + StatIDEnd IfIf Len(StatID) >= 2 ThenStatID = Trim(Right(StatID, 2))End IfEnd IfRem 取读写命令Cmd = Trim(Hex(WRcmd))If Cmd = "" ThenMsgBox "读写命令不能为空!", vbInformation + vbOKOnly, "系统提示!"Exit FunctionElseIf Len(Cmd) = 1 ThenCmd = "0" + CmdEnd IfIf Len(Cmd) >= 2 ThenCmd = Trim(Right(Cmd, 2))End IfEnd IfRem 取读写数据的地址Address = Trim(Tran_Format(Trim(Hex(WRAddress))))WRAddressHi = Trim(Mid$(Address, 1, 2))WRAddressLo = Trim(Mid$(Address, 3, 2))Rem 取读写的数据(读时为字节数,写时为要写的数据)hData = Trim(Tran_Format(Trim(Hex(Data))))DataHi = Trim(Mid$(hData, 1, 2))DataLo = Trim(Mid$(hData, 3, 2))Rem 计算从机地址的校验CRCBuffer1 = ACS510_CRC(65535, StationID)Rem 计算读写命令的校验CRCBuffer2 = ACS510_CRC(CRCBuffer1, WRcmd)Rem 计算读写地址高半字节的校验If ReadAddressHi = "00" ThenReadAddressHi = ""CRCBuffer3 = CRCBuffer2ElseCRCBuffer3 = ACS510_CRC(CRCBuffer2, Tran_HD(WRAddressHi))End IfRem 计算读写地址低半字节的校验CRCBuffer4 = ACS510_CRC(CRCBuffer3, Tran_HD(WRAddressLo))Rem 计算读写数据高半字节的校验If DataHi = "00" ThenCRCBuffer5 = CRCBuffer4DataHi = ""ElseCRCBuffer5 = ACS510_CRC(CRCBuffer4, Tran_HD(DataHi))End IfRem 计算读写数据低半字节的校验,既最终的校验CRC = Trim(Tran_Format(Hex(ACS510_CRC(CRCBuffer5, Tran_HD(DataLo))))) Rem 取校验的高半字节CRCHi = Trim(Mid$(CRC, 1, 2))Rem 取校验的低半字节CRCLo = Trim(Mid$(CRC, 3, 2))Rem 重新组合校验的结果CRC_Even = CRCLo + CRCHiRem 返回发送字符串ACS510_Cmd = StatID + Cmd + WRAddressHi + WRAddressLo + DataHi + DataLo + CRC_EvenEnd Function。

vbnet crc查表法

vbnet crc查表法

vbnet crc查表法摘要:1.介绍CRC(循环冗余校验)2.CRC在中的查表法3.查表法的原理4.实现查表法的代码示例5.总结与展望正文:CRC(循环冗余校验,Cyclic Redundancy Check)是一种用于检测数据传输或存储中的错误的技术。

在中,CRC的查表法是一种高效的方法,可以快速地进行CRC校验。

查表法的原理是预先计算出一张CRC校验表,表中包含了不同数据长度对应的CRC值。

当需要进行CRC校验时,只需根据数据长度在查表法中找到对应的CRC值,然后将该值与数据进行异或操作,最后得到的结果与CRC校验码进行比较,如果相等,则认为数据传输或存储正确,否则存在错误。

下面是一个使用实现查表法的CRC校验示例代码:```vbnetImports SystemModule CRCModuleSub Main()Dim data As String = "123456789"Dim crc As Integer = GetCRC(data)Console.WriteLine("原始数据: " & data)Console.WriteLine("CRC校验码: " & crc.ToString)End SubFunction GetCRC(data As String) As IntegerDim crcTable() As Integer =CType(GetType(Integer).GetField("crcTable",System.Reflection.BindingFlags.Static OrSystem.Reflection.BindingFlags.NonPublic).GetValue(Nothing), Integer()) Dim length As Integer = data.LengthDim crc As Integer = 0xFFFFFor i As Integer = 0 To length - 1crc = (crc Xor CByte(data(i))) & 0xFFFFIf crc > 0x8000 Thencrc = (crc >> 16) ^ crcTable(length - i - 1)Elsecrc = (crc << 16) ^ crcTable(length - i - 1)End IfNextReturn crcEnd FunctionEnd Module```此代码定义了一个名为GetCRC的函数,该函数接受一个字符串数据作为输入,并返回计算得到的CRC校验码。

用VB实现查表法计算CRC码的CRC校验软件设计课程设计报告

用VB实现查表法计算CRC码的CRC校验软件设计课程设计报告

用查表法计算CRC码的CRC校验软件设计通信0903班、学号0909091609、姓名陈洪亮;指导老师:王国才,杨政宇1.设计目标用查表法计算CRC码的CRC校验软件设计。

2.设计原理和方法原理循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。

它是利用除法及余数的原理来作错误侦测(Error Detecting)的。

实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

CRC32循环冗余校验标准多项为CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1其对应的数字就为:1 0000 0100 1100 0001 0001 1101 1011 0111也就是0x04C11DB7 (多项式对应的数字可能颠倒,颠倒后得到的是0Xedb88320,其实也是正确的)。

CRC32 要求输入的字节要颠倒,那么在程序中,在对每个字节处理前,还要先把这个字节先颠倒一下,再处理,那很麻烦。

所以就把“直接查表法”算法颠倒一下(查询表颠倒),那么算法就可以直接处理不颠倒的字节了,就方便多了。

比如,直接查询表的[01H]= 04C11DB7H,因为 01H 镜像后是 80H,04C11DB7H 镜像后是 EDB88320H,就得到正规查询表的[80H]= EDB88320H。

举例来说,假设待测的原始数据是 10H,简单起见,不考虑寄存器移出的字节的影响(即假设它是 00H)“直接查表法”,原始数据先颠倒为 01H,根据 01H 查表得 04C11DB7H,寄存器移出的字节是向左移。

“颠倒查表法”,直接根据原始数据 10H 查表得 EDB88320H,寄存器移出的字节是向右移。

可见,这时这二个方法本质上是一样的。

方法首先是表的生成,查表法一次处理一个字节的数据,所以crc32表有256个项(2^8),crc32多项式自己与自己异或,使左移出去的8位数字,为0到255,然后剩余的的值作为直接查表法表项。

crc校验的方法

crc校验的方法

crc校验的方法
CRC(CyclicRedundancyCheck)校验是一种常用的错误检测方法,它可以在数据传输过程中检测出单比特或多比特的差错。

CRC校验的基本原理是通过生成多项式除法来计算校验码。

以下是CRC校验的基本步骤:
1.选择生成多项式:首先需要选择一个生成多项式,通常使用二进制形式表示。

生成多项式的位数决定了校验码的长度。

常用的生成多项式有CRC-8、CRC-16和CRC-32等。

2.初始化寄存器:将寄存器初始化为全0。

3.逐位计算:按照从高位到低位的顺序,依次对待发送的数据进行处理。

-如果当前位是1,则将寄存器与生成多项式进行异或操作。

-然后将寄存器向右移动一位,最高位补零。

4.处理完所有数据后,得到的寄存器值即为校验码。

5.将校验码附加到待发送的数据后面。

6.接收端收到数据后,同样按照相同的生成多项式进行校验计算。

如果计算出的校验码与接收到的校验码一致,则认为数据没有发生错误;如果不一致,则认为数据可能存在错误。

CRC校验具有简单、高效的特点,能够检测出大部分常见的传输错误。

然而,CRC校验并不能纠正错误,只能检测出错误的存在。

在实际应用中,CRC校验通常与其他纠错方法(如重发请求)结合使用,以提高数据传输的可靠性。

1。

vbnet crc查表法

vbnet crc查表法

vbnet crc查表法在中使用查表法(Table-Driven Method)来计算CRC(循环冗余校验)校验值,通常会创建一个预计算好的CRC表。

以下是一个简单的示例,演示了如何使用查表法计算CRC32值:Imports System.TextModule CRCExample' 预计算的CRC32查表Private ReadOnly crc32Table As UInteger() = {&H0, &H77073096UI, &HEE0E612CUI, &H990951BAUI, &H76DC419UI, &H706AF48FUI, &HE963A535UI, &H9E6495A3UI, &HEDB8832UI, &H79DCB8A4UI, &HE0D5E91EUI, &H97D2D988UI, &H9B64C2BUI, &H7EB17CBDUI, &HE7B82D07UI, &H90BF1D91UI,&H1DB71064UI, &H6AB020F2UI, &HF3B97148UI, &H84BE41DEUI, &H1ADAD47DUI, &H6DDDE4EBUI, &HF4D4B551UI, &H83D385C7UI,&H136C9856UI, &H646BA8C0UI, &HFDBD44CUI, &H8C3D37C8UI, &H14015C4FUI, &H63066CD9UI, &HFA0F3D63UI, &H8D080DF5UI,&H3B6E20C8UI, &H4C69105EUI, &HD56041E4UI, &HA2677172UI, &H3C03E4D1UI, &H4B04D447UI, &HD20D85FDUI, &HA50AB56BUI,&H35B5A8FAUI, &H42B2986CUI, &HDBBBC9D6UI, &HACBCF940UI, &H32D86CE3UI, &H45DF5C75UI, &HDCD60DCFUI, &HABD13D59UI,&H26D930ACUI, &H51DE003AUI, &HC8D75180UI, &HBFD06116UI, &H21B4F4B5UI, &H56B3C423UI, &HCFBA9599UI, &HB8BDA50FUI,&H2802B89EUI, &H5F058808UI, &HC60CD9B2UI, &HB10BE924UI, &H2F6F7C87UI, &H58684C11UI, &HC1611DABUI, &HB6662D3DUI,&H76DC4190UI, &H1DB7106UI, &H98D220BCUI, &HEFD5102AUI, &H71B18589UI, &H6B6B51FUI, &H9FBFE4A5UI, &HE8B8D433UI,&H7807C9A2UI, &HF00F934UI, &H9609A88EUI, &HE10E9818UI, &H7F6A0DBBUI, &H86D3D2DUI, &HA00AE278UI, &HD70DD2EEUI,&H4E048354UI, &H3903B3C2UI, &HA7672661UI, &HD06016F7UI, &H4969474UI, &H3E6E77DBUI, &HAED16A4AUI, &HD9D65ADCUI,&H40DF0B66UI, &H37D83BF0UI, &HA9BCAE53UI, &HDEBB9EC5UI, &H47B2CF7FUI, &H30B5FFE9UI, &HBDBDF21UI, &HCABAC28AUI,&H53B39330UI, &H24B4A3A6UI, &HBAD03605UI, &HCDD70693UI, &H54DE5729UI, &H23D967BFUI, &HB3667A2EUI, &HC4614AB8UI,&H5D681B02UI, &H2A6F2B94UI, &HB40BBE37UI, &HC30C8EA1UI, &H5A05DF1BUI, &H2D02EF8DUI, &HBAA7A8C0UI, &HC0657EA6UI,&H2E167057UI, &H5D8A9ECUI, &HBP05BAFU, &HC2BFE8A1UI, &H2B0930D2UI, &H56B3B0BUI。

CRC校验原理及步骤

CRC校验原理及步骤

CRC校验原理及步骤标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]CRC校验原理及步骤什么是CRC校验CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。

当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。

到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。

因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。

如果有余数,则表明该帧在传输过程中出现了差错。

模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。

在循环冗余校验码(CRC)的计算中有应用到模2除法。

例:CRC校验步骤:CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

具体步骤:1. 选择合适的除数2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。

注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。

VB下CRC校验程序OK

VB下CRC校验程序OK
VB下CRC校验程序 .
2010-06-08 12:18 61人阅读 评论(0) 收藏 举报
VB下CRC校验程序
计算机技术不断发展,现代工业中,利用微机进行数据通讯工业控制应用也越来越广泛。传输距离、现场状况等诸多可能出现因素影响,计算机与受控设备之间通讯数据常会发生无法预测错误。防止错误所带来影响,一般通讯时采取数据校验办法,而循环冗余码校验是最常用校验方法之一。实际使用各种现场总线协议中,数据帧校验一般都采用这种检验方式。
ReturnData(0) = CRC16Hi 'CRC高位
ReturnData(1) = CRC16Lo 'CRC低位
CRC16 = ReturnData
End Function
'CRC低位字节值表
Function GetCRCLo(Ind As Long) As Byte
窗体上放置一命令按钮Command1,并添加如下代码:
Private Sub Command1_Click()
Dim CRC() As Byte
Dim d() As Byte '待传输数据
ReDim d(2) As Byte
d(0) = 123
d(1) = 112
国际标准中,生成多项式G(x)不同,CRC又可分为以下几种标准#43;X3+X2+X+1
②CRC-16码: G(x)=X16+X15+X2+1
③CRC-CCITT码: G(x)=X16+X12+X5+1
④CRC-32码: G(x)=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X+1

用VB实现大数据块CRC校验码算法

用VB实现大数据块CRC校验码算法

用 VB实现 大数 据块 CR C校验码 算法
董 延 华 , 李 欣 , 董 静 薇 , 王慕 坤
( 尔 滨 理 工大 学 测 控技 术 与通 信 工 程 学 院 , 龙 江 哈 尔 滨 104 ) 哈 黑 504 ]
_

要 : 对 通 信 系统 的 差 错 控 制 问 题 , 据 C C 棱 验 理 论 , 出 了一 种 大数 据 块 C C 棱 验 码 针 根 R 提 R
c =C 一 ㈨ 1 +C ‘+ +C = C A2 。 o .
i O
() 1
用多 项式 表示循 环码 可 发现某些 重 要特性 , ( , ) 在 n k 循 环 码 中有且仅有 一个 ( 一k 次多项式 J ) 1 G = .*I 十 。 ( 一 +g X +。 +g +l 1 x 中每个 码 多项式 () 2
Ab ta t To t e q e to f h r o — c n r l n t e c mm u ia i n s se , c o d n o t et e r s c : h u s i n o ee r r t r o t o h i o n c t y t m a c r i g t h h o y o o f CRC,t i r il l s r ts a i d f Al ort m o i d t f a s CRC n hs a t e i u ta e k n o g ih c l f b g a a r me ’ i VB. S l i g h o v n t e c l u a i n o i a a fa s’ a c l to f b g d t r me CRC i h r g e s o omm u i i n n t e p o r s f c nc o . at Ke s ro — c nto ;c c i e u d n y c e k y wor :e r r d o r l y l r d n a c h c ;p l no i l a r y c o y m a ra

VB下如何编写CRC校验程序

VB下如何编写CRC校验程序
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,_
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRC校验VB与汇编程序
采用CRC-16,即2字节冗余循环码CRC,低字节在前。

CRC码由发端计算,放置于发送消息帧的尾部,接收端再重新计算接收到信息的CRC码,比较计算得到的CRC码是否与接收到的相符,若不符则表明出错。

CRC码的计算包括整个消息内容,计算时只用8位数据位,而起始位、停止位及可能的校验位均不参与CRC计算。

CRC校验可以100%检测出所有奇数个随机错误。

CRC-16校验可以检测出长度小于等于16的突发错误,可以保证在1014 bit码元中只含有1位未被检测出的错误。

CRC-16的具体算法有多种,以下是一个例子。

1.置16位寄存器为全1,作为CRC寄存器。

2.把一个8位数据与16位CRC寄存器的低字节相异或,把结果放于CRC寄存器中。

3.把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(移出位)。

4.如果最低位为0,重复③(再移位);如果最低位为1,CRC寄存器与多项式A001H(1010 0000 0000 0001)进行异或。

5.重复③、④,直到右移8次,这样整个8位数据全部进行了处理。

6.重复②-⑤,进行下一个8位数据的处理。

7.将一帧的所有数据字节处理完后得到CRC-16寄存器。

8.将CRC-16寄存器的低字节和高字节交换,得到的值即为CRC-16码。

CRC校验汇编子程:
算法如下:
//CRC校验子程序开始
crc_jiaoyan:
mov 20h,#0xff
mov 21h,#0xff
mov 12h,#0x0d
mov 11h,#0x08
mov r0,#0x34
zijiekaishi:
mov a,21h
xrl a,@r0
kaishi:
rrc a
mov 21h,a
mov 10h,c
clr c
mov a,20h
rrc a
mov 0fh,c
mov 20h,a
anl 20h,#0x7f
jnb 10h,next
xrl 21h,#0x01
xrl 20h,#0xa0
next:
mov a,21h
djnz 11h,kaishi
mov 11h,#0x08
inc r0
djnz 12h,zijiekaishi
mov 42h,20h
mov 41h,21h
ret
//CRC校验子程序结束
比如:
Dim SendStr() As Byte
SendStr(0) = 1 '从站号是1
SendStr(1) = &H3 '读多个字的命令代码
SendStr(2) = 0 '起始地址高字节
SendStr(3) = 0 '起始地址低字节
SendStr(4) = &H0 '数据长度高字节
SendStr(5) = &H9 '数据长度低字节
SendStr(6) =?校验高位
SendStr(7) =?校验低位
CRC校验VB子程
'CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。

Function crc16(ByRef cmdstring() As Byte, ByVal j As Integer)
Dim data As Integer
Dim i As Integer
Addressreg_crc = &HFFFF
For i = 0 To j
Addressreg_crc = Addressreg_crc Xor cmdstring(i)
For j = 0 To 7
data = Addressreg_crc And &H1
If data Then
Addressreg_crc = Int(Addressreg_crc / 2)
Addressreg_crc = Addressreg_crc And &H7FFF Addressreg_crc = Addressreg_crc Xor &HA001 Else
Addressreg_crc = Addressreg_crc / 2
Addressreg_crc = Addressreg_crc And &H7FFF End If
Next j
Next i
If Addressreg_crc < 0 Then
Addressreg_crc = Addressreg_crc - &HFFFF0000 End If
HiByte = Addressreg_crc And &HFF
LoByte = (Addressreg_crc And &HFF00) / &H100 End Function
'调用
Call crc16(SendStr,5)
SendStr(6) = HiByte
SendStr(7) = LoByte。

相关文档
最新文档