7,763
社区成员
发帖
与我相关
我的任务
分享
'http://bbs.csdn.net/topics/391542907
Option Explicit
'这是按我#11链接中的逐位计算法翻译的'
Public Function CRC_CCITT(buf() As Byte, ByVal InitCRC As Long) As Long
Dim shift As Long
Dim Data As Long
Dim val As Long
Dim i As Long
Dim j As Long
shift = InitCRC And &HFFFF&
For i = 0 To UBound(buf)
Data = buf(i) * &H100&
For j = 1 To 8
val = shift Xor Data
shift = (shift * 2) And &HFFFF&
Data = (Data * 2) And &HFFFF&
If (val And &H8000&) = &H8000& Then
shift = shift Xor &H1021&
End If
Next
Next
CRC_CCITT = (shift And &HFFFF&)
End Function
Sub Main()
Dim Data() As Byte
Data = HexToArr("004210010000000042555159465047424D5432303135303831313130353232306365633264623062366130643062316139303432303030656633336535336562")
Debug.Print "0000", Hex(CRC_CCITT(Data, 0))
Debug.Print "FFFF", Hex(CRC_CCITT(Data, &HFFFF&))
Debug.Print "1D0F", Hex(CRC_CCITT(Data, &H1D0F&))
Debug.Print "5498", Hex(CRC_CCITT(Data, &H5498&))
End Sub
'这是用来找到&H5498&这个初始值的方法'
Sub FindInitCRC()
Dim i As Long
Dim crc As Long
Dim Data() As Byte
Data = HexToArr("004210010000000042555159465047424D5432303135303831313130353232306365633264623062366130643062316139303432303030656633336535336562")
For i = 0 To &HFFFF&
crc = CRC_CCITT(Data, i)
Debug.Print Hex(i), Hex(crc)
If crc = &H541E Then Exit For
Next
End Sub
Public Function HexToArr(ByVal Data As String) As Byte()
'借用#6的代码'
End Function
0000 24A4
FFFF F27E
1D0F F112
5498 541E
D:\CRC>tst_crc.exe -x
CRC algorithm sample program
Lammert Bies, Version 1.16
Input: 004210010000000042555159465047424D543230313530383131313035323230636563326
4623062366130643062316139303432303030656633336535336562
"" :
CRC16 = 0x0BE7 / 3047
CRC16 (Modbus) = 0x24A7 / 9383
CRC16 (Sick) = 0x5F25 / 24357
CRC-CCITT (0x0000) = 0x24A4 / 9380
CRC-CCITT (0xffff) = 0xF27E / 62078
CRC-CCITT (0x1d0f) = 0xF112 / 61714
CRC-CCITT (Kermit) = 0xA172 / 41330
CRC-DNP = 0x082E / 2094
CRC32 = 0x653399C1 / 1697880513