VBMAN.ToolsCrc - CRC Checksum Calculation Object
Overview
VBMAN.ToolsCrc provides CRC16 and CRC32 checksum calculation functionality, supporting multiple data input formats (byte array, HEX string, text), widely used in data verification, communication protocols, file checksums, and other scenarios.
Core Features
- Multiple Algorithms: Supports CRC16 (Modbus) and CRC32 (IEEE 802.3)
- Multi-format Input: Supports byte arrays, HEX strings, text strings
- High Performance: Built-in lookup table for fast calculation
- Chain Calling: Fluent API design
- Flexible Output: Supports Long, Currency, byte array, HEX string, and other output formats
Enums
CRCType
CRC type enum
Public Enum CRCType
CRC16 = 0
CRC32 = 1
End EnumCRCDataType
Data type enum
Public Enum CRCDataType
DataType_ByteArray = 0 ' Byte array
DataType_HexString = 1 ' HEX string
DataType_Text = 2 ' Text string
End EnumMethods
Data
Set data to calculate (default member, can be omitted)
Public Function Data(Optional ByVal DataType As CRCDataType = DataType_ByteArray, Optional ByVal Content As Variant) As cToolsCrcParameters:
DataType- Data type (see CRCDataType enum)Content- Data content
Example:
' Byte array
Dim bytes(0 To 3) As Byte
bytes(0) = &H01: bytes(1) = &H02
bytes(2) = &H03: bytes(3) = &H04
VBMAN.ToolsCrc.Data DataType_ByteArray, bytes
' HEX string (automatically handles spaces, hyphens, colons)
VBMAN.ToolsCrc.Data DataType_HexString, "01 02 03 04"
VBMAN.ToolsCrc.Data DataType_HexString, "01-02-03-04"
VBMAN.ToolsCrc.Data DataType_HexString, "01020304"
' Text string
VBMAN.ToolsCrc.Data DataType_Text, "Hello World"CalculateCRC16
Calculate CRC16 checksum (Modbus polynomial 0xA001)
Public Function CalculateCRC16(Optional ByVal StartIndex As Long = 0, Optional ByVal Length As Long = -1) As cToolsCrcParameters:
StartIndex- Start index (default 0)Length- Data length (default -1 means to end)
Example:
' Basic calculation
Dim crc As Long
crc = VBMAN.ToolsCrc.Data(DataType_HexString, "01 03 00 00 00 0A").CalculateCRC16.ReturnLong
Debug.Print "CRC16: " & Hex(crc) ' Output: CRC16: C5CD
' Chain calling
Dim hexResult As String
hexResult = VBMAN.ToolsCrc.Data(DataType_Text, "Hello").CalculateCRC16.ReturnHex
Debug.Print "CRC16 HEX: " & hexResultResult Return Methods
ReturnLong
Return CRC value as Long type
Public Function ReturnLong(Optional ByVal CRCTypeValue As CRCType = CRC16) As LongNote: CRC32 values greater than 2147483647 will become negative
Example:
Dim crc As Long
crc = VBMAN.ToolsCrc.Data(DataType_Text, "test").CalculateCRC16.ReturnLong
Debug.Print crc ' Decimal valueReturnCurrency
Return CRC32 value as Currency type (unsigned 32-bit)
Public Function ReturnCurrency(Optional ByVal CRCTypeValue As CRCType = CRC16) As CurrencyNote: Currency type can represent unsigned 32-bit values from 0 to 4294967295
Example:
Dim crc As Currency
crc = VBMAN.ToolsCrc.Data(DataType_Text, "test").CalculateCRC16.ReturnCurrency
Debug.Print crc ' Positive value, unsignedReturnBytes
Return CRC value as byte array
Public Function ReturnBytes(Optional ByVal CRCTypeValue As CRCType = CRC16) As Byte()Note: CRC16 returns 2 bytes (high byte first), CRC32 returns 4 bytes (high byte first)
Example:
Dim crcBytes() As Byte
crcBytes = VBMAN.ToolsCrc.Data(DataType_HexString, "01 02").CalculateCRC16.ReturnBytes(CRC16)
' Verify
Debug.Print Hex(crcBytes(0)) & " " & Hex(crcBytes(1))ReturnHex
Return CRC value as hexadecimal string
Public Function ReturnHex(Optional ByVal CRCTypeValue As CRCType = CRC16) As StringNote: CRC16 returns 4 uppercase characters, CRC32 returns 8 uppercase characters
Example:
Dim hexResult As String
hexResult = VBMAN.ToolsCrc.Data(DataType_Text, "Hello World").CalculateCRC16.ReturnHex
Debug.Print hexResult ' For example: B001ReturnHexString
Return hexadecimal string with separator (suitable for display)
Public Function ReturnHexString(Optional ByVal CRCTypeValue As CRCType = CRC16, Optional ByVal Separator As String = " ") As StringExample:
Dim hexWithSpace As String
hexWithSpace = VBMAN.ToolsCrc.Data(DataType_HexString, "01 02 03").CalculateCRC16.ReturnHexString(CRC16, " ")
Debug.Print hexWithSpace ' For example: B0 01
Dim hexWithDash As String
hexWithDash = VBMAN.ToolsCrc.Data(DataType_HexString, "01 02 03").CalculateCRC16.ReturnHexString(CRC16, "-")
Debug.Print hexWithDash ' For example: B0-01Comprehensive Examples
Example 1: Modbus RTU CRC16 Calculation
Private Sub ModbusCrcExample()
' Modbus RTU frame: device address 01, function code 03, start address 0000, register count 000A
Dim frame As String
frame = "01 03 00 00 00 0A"
' Calculate CRC16
Dim crcResult As String
crcResult = VBMAN.ToolsCrc.Data(DataType_HexString, frame).CalculateCRC16.ReturnHexString(CRC16, " ")
Debug.Print "Data frame: " & frame
Debug.Print "CRC16: " & crcResult ' Output: C5 CD
' Complete frame
Debug.Print "Complete frame: " & frame & " " & crcResult
End SubExample 2: Data Frame Verification
Private Function VerifyFrame(dataFrame As String, expectedCrc As String) As Boolean
' Extract data and CRC
Dim dataPart As String
Dim crcPart As String
dataPart = Left(dataFrame, Len(dataFrame) - 4)
crcPart = Right(dataFrame, 4)
' Calculate CRC
Dim calculatedCrc As String
calculatedCrc = VBMAN.ToolsCrc.Data(DataType_HexString, dataPart).CalculateCRC16.ReturnHex
' Compare
VerifyFrame = (UCase(calculatedCrc) = UCase(expectedCrc))
End Function
Private Sub TestVerify()
Dim frame As String
frame = "01 03 00 00 00 0A C5 CD"
If VerifyFrame(frame, "C5CD") Then
Debug.Print "CRC verification passed"
Else
Debug.Print "CRC verification failed"
End If
End SubExample 3: Serial Communication Data Packaging
Private Function PackSerialCommand(cmdCode As Byte, param As Byte) As Byte()
' Build data frame
Dim data(0 To 1) As Byte
data(0) = cmdCode
data(1) = param
' Calculate CRC16
Dim crcBytes() As Byte
crcBytes = VBMAN.ToolsCrc.Data(DataType_ByteArray, data).CalculateCRC16.ReturnBytes(CRC16)
' Assemble complete frame: data + CRC
Dim frame() As Byte
ReDim frame(0 To 3)
frame(0) = data(0)
frame(1) = data(1)
frame(2) = crcBytes(0) ' CRC high byte
frame(3) = crcBytes(1) ' CRC low byte
PackSerialCommand = frame
End Function
Private Sub SendCommand()
Dim cmd() As Byte
cmd = PackSerialCommand(&H10, &H01) ' Command 0x10, parameter 0x01
' Send to serial port
' MSComm1.Output = cmd
End SubExample 4: Batch CRC Calculation
Private Sub BatchCrcCalculation()
Dim testData As Variant
testData = Array( _
"01 03 00 00 00 0A", _
"01 03 00 64 00 02", _
"01 06 00 01 00 64" _
)
Dim i As Integer
For i = LBound(testData) To UBound(testData)
Dim dataStr As String
dataStr = testData(i)
Dim crcHex As String
crcHex = VBMAN.ToolsCrc.Data(DataType_HexString, dataStr).CalculateCRC16.ReturnHex
Debug.Print "Data: " & dataStr & " -> CRC16: " & crcHex
Next i
End SubExample 5: File CRC Checksum
Private Function CalculateFileCrc(filePath As String) As String
On Error GoTo ErrorHandler
' Read file to byte array
Dim fileNum As Integer
fileNum = FreeFile
Open filePath For Binary As #fileNum
Dim fileSize As Long
fileSize = LOF(fileNum)
Dim fileBytes() As Byte
ReDim fileBytes(0 To fileSize - 1)
Get #fileNum, , fileBytes
Close #fileNum
' Calculate CRC16
Dim crcHex As String
crcHex = VBMAN.ToolsCrc.Data(DataType_ByteArray, fileBytes).CalculateCRC16.ReturnHex
CalculateFileCrc = crcHex
Exit Function
ErrorHandler:
CalculateFileCrc = ""
End Function
Private Sub CheckFileIntegrity()
Dim crc As String
crc = CalculateFileCrc("C:\\data\\important.bin")
Debug.Print "File CRC16: " & crc
End SubBest Practices
- HEX Format Flexibility: HEX strings support space, hyphen, colon separators, automatically cleaned
- Endianness Note: ReturnBytes returns high byte first (big-endian)
- Unsigned Handling: CRC32 recommended to use ReturnCurrency to avoid sign issues
- Pre-initialization: Class automatically builds lookup table during initialization, no manual call needed
- Error Checking: Ensure data is correctly set before calculation
Algorithm Description
CRC16 (Modbus)
- Polynomial: 0xA001 (or 0x8005 reversed)
- Initial Value: 0xFFFF
- Result Processing: No additional processing
CRC32 (IEEE 802.3)
- Polynomial: 0xEDB88320
- Initial Value: 0xFFFFFFFF
- Result Processing: XOR with 0xFFFFFFFF (invert)
Common CRC Values Reference
' Empty data CRC16
Debug.Print VBMAN.ToolsCrc.Data(DataType_ByteArray, Array()).CalculateCRC16.ReturnHex
' Result: FFFF
' "123456789" text CRC16
Debug.Print VBMAN.ToolsCrc.Data(DataType_Text, "123456789").CalculateCRC16.ReturnHex
' Standard result: 31C3