VB下的CRC校验程序
- 格式:doc
- 大小:102.00 KB
- 文档页数:5
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`函数显示结果。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''使用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源代码-crc32自校验(VB source code, -crc32 selfcalibration)Class module (name clsCRC) codeOption ExplicitPublic Enum CRCAlgorithmsCRC16CRC32End EnumPrivate m_Algorithm As BooleanPrivate m_CRC16 As LongPrivate m_CRC16Asm () As BytePrivate m_CRC16Init As BooleanPrivate m_CRC16Table (0, To 255) As LongPrivate m_CRC32 As LongPrivate m_CRC32Asm () As BytePrivate m_CRC32Init As BooleanPrivate m_CRC32Table (0, To 255) As LongPrivate, Declare, Function, CallWindowProc, Lib, user32, Alias, CallWindowProcA, ByVal, As, Long, ByVal, hWnd, As, Long, ByVal, Msg, As, Long, ByVal, wParam, As, Long, ByVal, lParam, As, Long,, lpPrevWndFunc, As, LongPublic, Function, AddBytes (ByteArray ()) As Byte) As VariantDim ByteSize As LongOn, Local, Error, GoTo, NoDataByteSize = UBound (ByteArray) - LBound (ByteArray) + 1On Local Error GoTo 0Select Case m_AlgorithmCase CRC16Call, CallWindowProc (VarPtr (m_CRC16Asm (0)), VarPtr(m_CRC16), VarPtr (ByteArray (LBound (ByteArray))), VarPtr (m_CRC16Table (0)), ByteSize)Case CRC32Call, CallWindowProc (VarPtr (m_CRC32Asm (0)), VarPtr(m_CRC32), VarPtr (ByteArray (LBound (ByteArray))), VarPtr (m_CRC32Table (0)), ByteSize)End SelectNoData:AddBytes = ValueEnd FunctionPublic, Function, AddString (Text, As, String) As VariantAddString = AddBytes (StrConv (Text, vbFromUnicode))End FunctionPublic, Property, Let, Algorithm (New_Value, As, CRCAlgorithms)M_Algorithm = New_ValueSelect Case m_AlgorithmCase CRC16If (Not, m_CRC16Init), Then, Call, InitializeCRC16Case CRC32If (Not, m_CRC32Init), Then, Call, InitializeCRC32End SelectCall ClearEnd PropertyPublic, Property, Get, Algorithm (), As, CRCAlgorithmsAlgorithm = m_AlgorithmEnd PropertyPublic, Function, CalculateBytes (ByteArray ()) As Byte) As VariantCall ClearCalculateBytes = AddBytes (ByteArray)End FunctionPublic, Function, CalculateFile (Filename, As, String) As VariantDim Filenr As IntegerDim ByteArray () As ByteIf (FileLen (Filename) = 0) Then, Exit, FunctionFilenr = FreeFile二进制打开文件作为# filenrReDim ByteArray(0~LOF(filenr)- 9)得到# filenr,bytearray()近# filenrcalculatefile = calculatebytes(ByteArray)端功能公共财产得到value()变异选择案例m_algorithm案例CRC16价值=(m_crc16和65535)案例CRC32价值=(不m_crc32)最后选择最后的财产公共财产让价值(new_value变异)选择案例m_algorithm案例CRC16m_crc16 = new_value案例CRC32m_crc32 = new_value最后选择最后的财产私有子initializecrc16() 暗淡我一样长暗j长k长小CRC昏暗的SASM作为字符串对于我= 0比255k = i * 256CRC = 0对于j = 0到7如果((CRC异或k)和32768)= 32768)CRC(CRC×2)异或和h1021其他的CRC =(CRC * 2)最后如果k=k * 2下一个m_crc16table(我)= CRC下一个SASM=“5589e55756505351528b45088b008b750c8b7d108b4d1431db8a1e30 e3668b149f30c66689d0464975ef25ffff00008b4d0889015a595b585e5 f89ec5dc21000”ReDim m_crc16asm(0 Len(SASM)2 - 1)我= 1 Len(SASM)步骤2m_crc16asm(我2)=瓦迩(“H”和美元中期(SASM,I,2))下一个m_crc16init =真端子公共子clear()m_crc16 = 0m_crc32 =和hffffffff端子私有子initializecrc32()暗淡我一样长昏暗的SASM作为字符串m_crc32table(0)= & H0m_crc32table(1)=与h77073096 m_crc32table(2)=与hee0e612c m_crc32table(3)=与h990951ba m_crc32table(4)=与h76dc419 m_crc32table(5)=与h706af48fm_crc32table(6)=与he963a535 m_crc32table(7)=与h9e6495a3 m_crc32table(8)=与hedb8832 m_crc32table(9)=与h79dcb8a4 m_crc32table(10)=与he0d5e91e m_crc32table(11)=与h97d2d988 m_crc32table(12)=与h9b64c2b m_crc32table(13)=与h7eb17cbd m_crc32table(14)=与he7b82d07 m_crc32table(15)=与h90bf1d91 m_crc32table(16)=与h1db71064 m_crc32table(17)=与h6ab020f2 m_crc32table(18)=与hf3b97148 m_crc32table(19)=与h84be41de m_crc32table(20)=与h1adad47d m_crc32table(21)=与h6ddde4ebm_crc32table(22)=与hf4d4b551 m_crc32table(23)=与h83d385c7 m_crc32table(24)=与h136c9856 m_crc32table(25)=与h646ba8c0 m_crc32table(26)=与hfd62f97a m_crc32table(27)=与h8a65c9ec m_crc32table(28)=与h14015c4f m_crc32table(29)=与h63066cd9 m_crc32table(30)=与hfa0f3d63 m_crc32table(31)=与h8d080df5 m_crc32table(32)=与h3b6e20c8 m_crc32table(33)=与h4c69105e m_crc32table(34)=与hd56041e4 m_crc32table(35)=与ha2677172 m_crc32table(36)=与h3c03e4d1m_crc32table(37)=与h4b04d447 m_crc32table(38)=与hd20d85fd m_crc32table(39)=与ha50ab56b m_crc32table(40)=与h35b5a8fa m_crc32table(41)=与h42b2986c m_crc32table(42)=与hdbbbc9d6 m_crc32table(43)=与hacbcf940 m_crc32table(44)=与h32d86ce3 m_crc32table(45)=与h45df5c75 m_crc32table(46)=与hdcd60dcf m_crc32table(47)=与habd13d59 m_crc32table(48)=与h26d930ac m_crc32table(49)=与h51de003a m_crc32table(50)=与hc8d75180 m_crc32table(51)=与hbfd06116 m_crc32table(52)=与h21b4f4b5m_crc32table(53)=与h56b3c423 m_crc32table(54)=与hcfba9599 m_crc32table(55)=与hb8bda50f m_crc32table(56)=与h2802b89e m_crc32table(57)=与h5f058808 m_crc32table(58)=与hc60cd9b2 m_crc32table(59)=与hb10be924 m_crc32table(60)=与h2f6f7c87 m_crc32table(61)=与h58684c11 m_crc32table(62)=与hc1611dab m_crc32table(63)=与hb6662d3d m_crc32table(64)=与h76dc4190 m_crc32table(65)=与h1db7106 m_crc32table(66)=与h98d220bc m_crc32table(67)=与hefd5102am_crc32table(68)=与h71b18589 m_crc32table(69)=与h6b6b51f m_crc32table(70)=与h9fbfe4a5 m_crc32table(71)=与he8b8d433 m_crc32table(72)=与h7807c9a2 m_crc32table(73)=与hf00f934 m_crc32table(74)=与h9609a88e m_crc32table(75)=与he10e9818 m_crc32table(76)=与h7f6a0dbb m_crc32table(77)=与h86d3d2d m_crc32table(78)=与h91646c97 m_crc32table(79)=与he6635c01 m_crc32table(80)=与h6b6b51f4 m_crc32table(81)=与h1c6c6162 m_crc32table(82)=与h856530d8 m_crc32table(83)=与hf262004em_crc32table(84)=与h6c0695ed m_crc32table(85)=与h1b01a57b m_crc32table(86)=与h8208f4c1 m_crc32table(87)=与hf50fc457 m_crc32table(88)=与h65b0d9c6 m_crc32table(89)=与h12b7e950 m_crc32table(90)=与h8bbeb8ea m_crc32table(91)=与hfcb9887c m_crc32table(92)=与h62dd1ddf m_crc32table(93)=与h15da2d49 m_crc32table(94)=与h8cd37cf3 m_crc32table(95)=与hfbd44c65 m_crc32table(96)=与h4db26158 m_crc32table(97)=与h3ab551ce m_crc32table(98)=与ha3bc0074m_crc32table(99)=与hd4bb30e2 m_crc32table(100)=与h4adfa541 m_crc32table(101)=与h3dd895d7 m_crc32table(102)=与ha4d1c46d m_crc32table(103)=与hd3d6f4fb m_crc32table(104)=与h4369e96a m_crc32table(105)=与h346ed9fc m_crc32table(106)=与had678846 m_crc32table(107)=与hda60b8d0 m_crc32table(108)=与h44042d73 m_crc32table(109)=与h33031de5 m_crc32table(110)=与haa0a4c5f m_crc32table(111)=与hdd0d7cc9 m_crc32table(112)=与h5005713c m_crc32table(113)=与h270241aa m_crc32table(114)=与hbe0b1010m_crc32table(115)=与hc90c2086 m_crc32table(116)=与h5768b525 m_crc32table(117)=与h206f85b3 m_crc32table(118)=与hb966d409 m_crc32table(119)=与hce61e49f m_crc32table(120)=与h5edef90e m_crc32table(121)=与h29d9c998 m_crc32table(122)=与hb0d09822 m_crc32table(123)=与hc7d7a8b4 m_crc32table(124)=与h59b33d17 m_crc32table(125)=与h2eb40d81 m_crc32table(126)=与hb7bd5c3b m_crc32table(127)=与hc0ba6cad m_crc32table(128)=与hedb88320 m_crc32table(129)=与h9abfb3b6m_crc32table(130)=与h3b6e20c m_crc32table(131)=与h74b1d29a m_crc32table(132)=与head54739 m_crc32table(133)=与h9dd277af m_crc32table(134)=与h4db2615 m_crc32table(135)=与h73dc1683 m_crc32table(136)=与he3630b12 m_crc32table(137)=与h94643b84 m_crc32table(138)=与hd6d6a3e m_crc32table(139)=与h7a6a5aa8 m_crc32table(140)=与he40ecf0b m_crc32table(141)=与h9309ff9d m_crc32table(142)=与ha00ae27 m_crc32table(143)=与h7d079eb1 m_crc32table(144)=与hf00f9344 m_crc32table(145)=与h8708a3d2m_crc32table(146)=与h1e01f268 m_crc32table(147)=与h6906c2fe m_crc32table(148)=与hf762575d m_crc32table(149)=与h806567cb m_crc32table(150)=与h196c3671 m_crc32table(151)=与h6e6b06e7 m_crc32table(152)=与hfed41b76 m_crc32table(153)=与h89d32be0 m_crc32table(154)=与h10da7a5a m_crc32table(155)=与h67dd4acc m_crc32table(156)=与hf9b9df6f m_crc32table(157)=与h8ebeeff9 m_crc32table(158)=与h17b7be43 m_crc32table(159)=与h60b08ed5 m_crc32table(160)=与hd6d6a3e8m_crc32table(161)=与ha1d1937e m_crc32table(162)=与h38d8c2c4 m_crc32table(163)=与h4fdff252 m_crc32table(164)=与hd1bb67f1 m_crc32table(165)=与ha6bc5767 m_crc32table(166)=与h3fb506dd m_crc32table(167)=与h48b2364b m_crc32table(168)=与hd80d2bda m_crc32table(169)=与haf0a1b4c m_crc32table(170)=与h36034af6 m_crc32table(171)=与h41047a60 m_crc32table(172)=与hdf60efc3 m_crc32table(173)=与ha867df55 m_crc32table(174)=与h316e8eef m_crc32table(175)=与h4669be79 m_crc32table(176)=与hcb61b38cm_crc32table(177)=与hbc66831a m_crc32table(178)=与h256fd2a0 m_crc32table(179)=与h5268e236 m_crc32table(180)=与hcc0c7795 m_crc32table(181)=与hbb0b4703 m_crc32table(182)=与h220216b9 m_crc32table(183)=与h5505262f m_crc32table(184)=与hc5ba3bbe m_crc32table(185)=与hb2bd0b28 m_crc32table(186)=与h2bb45a92 m_crc32table(187)=与h5cb36a04 m_crc32table(188)=与hc2d7ffa7 m_crc32table(189)=与hb5d0cf31 m_crc32table(190)=与h2cd99e8b m_crc32table(191)=与h5bdeae1dm_crc32table(192)=与h9b64c2b0 m_crc32table(193)=与hec63f226 m_crc32table(194)=与h756aa39c m_crc32table(195)=与h26d930a m_crc32table(196)=与h9c0906a9 m_crc32table(197)=与heb0e363f m_crc32table(198)=与h72076785 m_crc32table(199)=与h5005713 m_crc32table(200)=与h95bf4a82 m_crc32table(201)=与he2b87a14 m_crc32table(202)=与h7bb12bae m_crc32table(203)=与hcb61b38 m_crc32table(204)=与h92d28e9b m_crc32table(205)=与he5d5be0d m_crc32table(206)=与h7cdcefb7 m_crc32table(207)=与hbdbdf21m_crc32table(208)=与h86d3d2d4 m_crc32table(209)=与hf1d4e242 m_crc32table(210)=与h68ddb3f8 m_crc32table(211)=与h1fda836e m_crc32table(212)=与h81be16cd m_crc32table(213)=与hf6b9265b m_crc32table(214)=与h6fb077e1 m_crc32table(215)=与h18b74777 m_crc32table(216)=与h88085ae6 m_crc32table(217)=与hff0f6a70 m_crc32table(218)=与h66063bca m_crc32table(219)=与h11010b5c m_crc32table(220)=与h8f659eff m_crc32table(221)=与hf862ae69 m_crc32table(222)=与h616bffd3m_crc32table(223)=与h166ccf45 m_crc32table(224)=与ha00ae278 m_crc32table(225)=与hd70dd2ee m_crc32table(226)=与h4e048354 m_crc32table(227)=与h3903b3c2 m_crc32table(228)=与ha7672661 m_crc32table(229)=与hd06016f7 m_crc32table(230)=与h4969474d m_crc32table(231)=与h3e6e77db m_crc32table(232)=与haed16a4a m_crc32table(233)=与hd9d65adc m_crc32table(234)=与h40df0b66 m_crc32table(235)=与h37d83bf0 m_crc32table(236)=与ha9bcae53 m_crc32table(237)=与hdebb9ec5 m_crc32table(238)=与h47b2cf7fm_crc32table(239)=与h30b5ffe9 m_crc32table(240)=与hbdbdf21c m_crc32table(241)=与hcabac28a m_crc32table(242)=与h53b39330 m_crc32table(243)=与h24b4a3a6 m_crc32table(244)=与hbad03605 m_crc32table(245)=与hcdd70693 m_crc32table(246)=与h54de5729 m_crc32table(247)=与h23d967bf m_crc32table(248)=与hb3667a2e m_crc32table(249)=与hc4614ab8 m_crc32table(250)=与h5d681b02 m_crc32table(251)=与h2a6f2b94 m_crc32table(252)=与hb40bbe37 m_crc32table(253)=与hc30c8ea1m_crc32table(254)=与h5a05df1bm_crc32table(255)=与h2d02ef8dSASM=“5589e557565053518b45088b008b750c8b7d108b4d1431db8a1e30c3 c1e80833049f464975f28b4d088901595b585e5f89ec5dc21000”ReDim m_crc32asm(0 Len(SASM)2 - 1)我= 1 Len(SASM)步骤2m_crc32asm(我2)=瓦迩(“H”和美元中期(SASM,I,2))下一个m_crc32init =真端子私有子class_initialize()CRC32算法=端子“窗口代码私有函数getcrc32()作为字符串昏暗的绿景为字符串错误crcerror绿景=应用程序路径和“\”和app.exename“.exe”昏暗的CCRC作为新的clscrc,filecrc美元CRC32算法= CCRC。
用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。
如何在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校验方法、错误处理和测试验证等。
编写时
需要根据具体的应用场景和需求来确定具体的实现细节和功能。
CRC12的C和VB写法CRC12的C和VB写法 [原创 2008-09-17 11:13:35]字号:大中小C写法:/*===================================== ========================================= ===========*/#define uchar unsigned char#define uint unsigned int/*----------CRC12校验------------*/uint CRC12(uchar* pcData,uchar len){uchar cTemp,temp;uint iCrc=0;while(len--!=0){for(cTemp=0x80; cTemp!=0; cTemp>>=1){if((iCrc&0x8000)!=0){iCrc<<=1;iCrc^=0x80d0;} //---余式CRC 乘以2 再求CRC ---//else{iCrc<<=1;}temp = ((*pcData)&0x7f);if((temp&cTemp)!=0){iCrc^=0x80d0; //----再加上本位的CRC----//}}pcData ;}return(iCrc>>4);}VB写法:'----------CRC12校验------------Public Function CRC12(ByRef pcData() As Byte) As IntegerDim str_len As Byte, FLAG As ByteDim cTemp As Byte, temp As Byte, tem As ByteDim CRCHI As Byte, CRCLO As ByteDim iCrc As Integertem = 0CRCHI = 0CRCLO = 0For str_len = 1 To UBound(pcData)DoEventscTemp = &H80Do While cT emp <> 0DoEventsIf ((CRCHI And &H80) <> 0) ThenFLAG = (CRCLO And &H80) \ &H80CRCLO = CRCLO And &H7FCRCLO = CRCLO * 2CRCHI = CRCHI And &H7F CRCHI = (CRCHI * 2) FLAGCRCHI = CRCHI Xor &H80 CRCLO = CRCLO Xor &HD0'---余式CRC 乘以2 再求CRC --- ElseFLAG = (CRCLO And &H80) \ &H80 CRCLO = CRCLO And &H7F CRCLO = CRCLO * 2CRCHI = CRCHI And &H7F CRCHI = (CRCHI * 2) FLAGEnd Iftemp = pcData(tem) And &H7FIf ((temp And cTemp) <> 0) Then CRCHI = CRCHI Xor &H80 CRCLO = CRCLO Xor &HD0'//----再加上本位的CRC----//End IfcTemp = cTemp \ 2Looptem = tem 1NextFLAG = CRCHI And &HFCRCHI = CRCHI \ 16CRCLO = CRCLO \ 16CRCLO = CRCLO (FLAG * 16)iCrc = CRCHI * 256 CRCLOCRC12 = iCrcEnd Function使用时,pcData参数的下标应该和需要校验的数据长度一致。
VB下的CRC校验程序随着计算机技术的不断发展,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。
由于传输距离、现场状况等诸多可能出现的因素影响,计算机与受控设备之间的通讯数据常会发生无法预测的错误。
为了防止错误所带来的影响,一般在通讯时采取数据校验的办法,而循环冗余码校验是最常用的校验方法之一。
在实际使用的各种现场总线协议中,数据帧的校验一般都采用这种检验方式。
一、循环冗余码校验原理循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。
它是利用除法及余数的原理来作错误侦测(Error Detecting)的。
他将要发送的数据比特序列当作一个多项式f(x)的系数,发送时用双方预先约定的生成多项式G(x)去除,求得一个余数多项式,将余数多项式加到数据多项式之后发送到接收端,接收端同样用G(x)去除接收到的数据,进行计算,然后把计算结果和实际接收到的余数多项式数据进行比较,相同的话表示传输正确。
CRC校验检错能力强,容易实现,是目前应用最广的检错码编码方式之一。
在国际标准中,根据生成多项式G(x)的不同,CRC又可分为以下几种标准:①CRC-12码:G(x)=X12+X11+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+1CRC-12码通常用来传送6-bit字符串。
CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。
CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。
下面以最常用的CRC-16为例来说明其生成过程。
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC 寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。
用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。
用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查表法摘要: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校验码。
用查表法计算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,然后剩余的的值作为直接查表法表项。
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。
VB下的CRC校验程序(2008-06-04 22:14:58)标签:杂谈分类:串口VB下的CRC校验程序计算机技术不断发展,现代工业中,利用微机进行数据通讯工业控制应用也越来越广泛。
传输距离、现场状况等诸多可能出现因素影响,计算机与受控设备之间通讯数据常会发生无法预测错误。
防止错误所带来影响,一般通讯时采取数据校验办法,而循环冗余码校验是最常用校验方法之一。
实际使用各种现场总线协议中,数据帧校验一般都采用这种检验方式。
一、循环冗余码校验原理循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。
它是利用除法及余数原理来作错误侦测(Error Detecting)。
他将要发送数据比特序列当作一个多项式f(x)系数,发送时用双方预先约定生成多项式G(x)去除,求一个余数多项式,将余数多项式加到数据多项式之后发送到接收端,接收端同样用G(x)去除接收到数据,进行计算,然后把计算结果和实际接收到余数多项式数据进行比较,相同话表示传输正确。
CRC校验检错能力强,容易实现,是目前应用最广检错码编码方式之一。
国际标准中,生成多项式G(x)不同,CRC又可分为以下几种标准:①CRC-12码: G(x)=X12+X11+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+1CRC-12码通常用来传送6-bit字符串。
CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。
CRC-32码大都被采用一种称为Point-to-Point同步传输中。
下面以最常用CRC-16为例来说明其生成过程。
CRC-16码由两个字节构成,开始时CRC寄存器每一位都预置为1,然后把CRC寄存器与8-bit数据进行异或,之后对CRC寄存器从高到低进行移位,最高位(MSB)位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)为1,则把寄存器与预定义多项式码进行异或,否则LSB为零,则无需进行异或。
重复上述由高至低移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器值与下一个8-bit数据异或并进行如前一个数据似8次移位。
所有字符处理完成后CRC寄存器内值即为最终CRC值。
下面为CRC计算过程:1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据第一个8-bit字符与16位CRC寄存器低8位进行异或,并把结果存入C RC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。
此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器内容即为CRC值。
二、循环冗余码校验程序编写明白了CRC校验码产生过程,编写起程序来就非常容易了。
Visual Basic广泛普及以及其数据通讯中重要位,下面就以VB语言来编写CRC生成程序,其它语言只需稍做修改即可。
编写CRC校验程序有两种办法:一种为计算法,一种为查表法。
通常使用查表法,尤其VB程序中,可以大大降低CPU运算时间。
下面对两种方法分别讨论。
1.计算法计算法就是依据CRC校验码产生原理来设计程序。
其优点是模块代码少,修改灵活,可移植性好。
其缺点为计算量大。
便于理解,这里假定了三位数据,而多项式码为A001(hex)。
窗体上放置一命令按钮Command1,并添加如下代码:Private Sub Command1_Click()Dim CRC() As ByteDim d() As Byte '待传输数据ReDim d(2) As Byted(0) = 123d(1) = 112d(2) = 135CRC = CRC16(d) '调用CRC16计算函数'CRC(0)为高位'CRC(1)为低位End Sub注意:数据传输时CRC低位可能前,而高位后。
Function CRC16(data() As Byte) As StringDim CRC16Lo As Byte, CRC16Hi As Byte'CRC寄存器Dim CL As Byte, CH As Byte'多项式码&HA001Dim SaveHi As Byte, SaveLo As ByteDim i As IntegerDim Flag As IntegerCRC16Lo = &HFFCRC16Hi = &HFFCL = &H1CH = &HA0For i = 0 To UBound(data)CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = CRC16HiSaveLo = CRC16LoCRC16Hi = CRC16Hi \ 2'高位右移一位CRC16Lo = CRC16Lo \ 2'低位右移一位If ((SaveHi And &H1) = &H1) Then '高位字节最后一位为1CRC16Lo = CRC16Lo or &H80'则低位字节右移后前面补1End If'否则自动补0If ((SaveLo And &H1) = &H1) Then 'LSB为1,则与多项式码进行异或CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext iDim ReturnData(1) As ByteReturnData(0) = CRC16Hi'CRC高位ReturnData(1) = CRC16Lo'CRC低位CRC16 = ReturnDataEnd Function2.查表法查表法优缺点与计算法正好相反。
便于比较,这里所有假定与计算法完全相同,都而窗体上放置一个Command1按钮,其代码部分与上面也完全一致。
下面只介绍CRC函数编写源代码。
Private Function CRC16(data() As Byte) As StringDim CRC16Hi As ByteDim CRC16Lo As ByteCRC16Hi = &HFFCRC16Lo = &HFFDim i As IntegerDim iIndex As LongFor i = 0 To UBound(data)iIndex = CRC16Lo Xor data(i)CRC16Lo = CRC16Hi Xor GetCRCLo(iIndex)'低位处理CRC16Hi = GetCRCHi(iIndex)'高位处理Next iDim ReturnData(1) As ByteReturnData(0) = CRC16Hi'CRC高位ReturnData(1) = CRC16Lo'CRC低位CRC16 = ReturnDataEnd Function'CRC低位字节值表Function GetCRCLo(Ind As Long) As ByteGetCRCLo = 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)End Function'CRC高位字节值表Function GetCRCHi(Ind As Long) As ByteGetCRCHi = 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, &HDA, &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)End Function。