Skip to content

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

vb
Public Enum CRCType
    CRC16 = 0
    CRC32 = 1
End Enum

CRCDataType

Data type enum

vb
Public Enum CRCDataType
    DataType_ByteArray = 0   ' Byte array
    DataType_HexString = 1   ' HEX string
    DataType_Text = 2        ' Text string
End Enum

Methods

Data

Set data to calculate (default member, can be omitted)

vb
Public Function Data(Optional ByVal DataType As CRCDataType = DataType_ByteArray, Optional ByVal Content As Variant) As cToolsCrc

Parameters:

  • DataType - Data type (see CRCDataType enum)
  • Content - Data content

Example:

vb
' 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)

vb
Public Function CalculateCRC16(Optional ByVal StartIndex As Long = 0, Optional ByVal Length As Long = -1) As cToolsCrc

Parameters:

  • StartIndex - Start index (default 0)
  • Length - Data length (default -1 means to end)

Example:

vb
' 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: " & hexResult

Result Return Methods

ReturnLong

Return CRC value as Long type

vb
Public Function ReturnLong(Optional ByVal CRCTypeValue As CRCType = CRC16) As Long

Note: CRC32 values greater than 2147483647 will become negative

Example:

vb
Dim crc As Long
crc = VBMAN.ToolsCrc.Data(DataType_Text, "test").CalculateCRC16.ReturnLong
Debug.Print crc  ' Decimal value

ReturnCurrency

Return CRC32 value as Currency type (unsigned 32-bit)

vb
Public Function ReturnCurrency(Optional ByVal CRCTypeValue As CRCType = CRC16) As Currency

Note: Currency type can represent unsigned 32-bit values from 0 to 4294967295

Example:

vb
Dim crc As Currency
crc = VBMAN.ToolsCrc.Data(DataType_Text, "test").CalculateCRC16.ReturnCurrency
Debug.Print crc  ' Positive value, unsigned

ReturnBytes

Return CRC value as byte array

vb
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:

vb
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

vb
Public Function ReturnHex(Optional ByVal CRCTypeValue As CRCType = CRC16) As String

Note: CRC16 returns 4 uppercase characters, CRC32 returns 8 uppercase characters

Example:

vb
Dim hexResult As String
hexResult = VBMAN.ToolsCrc.Data(DataType_Text, "Hello World").CalculateCRC16.ReturnHex
Debug.Print hexResult  ' For example: B001

ReturnHexString

Return hexadecimal string with separator (suitable for display)

vb
Public Function ReturnHexString(Optional ByVal CRCTypeValue As CRCType = CRC16, Optional ByVal Separator As String = " ") As String

Example:

vb
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-01

Comprehensive Examples

Example 1: Modbus RTU CRC16 Calculation

vb
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 Sub

Example 2: Data Frame Verification

vb
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 Sub

Example 3: Serial Communication Data Packaging

vb
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 Sub

Example 4: Batch CRC Calculation

vb
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 Sub

Example 5: File CRC Checksum

vb
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 Sub

Best Practices

  1. HEX Format Flexibility: HEX strings support space, hyphen, colon separators, automatically cleaned
  2. Endianness Note: ReturnBytes returns high byte first (big-endian)
  3. Unsigned Handling: CRC32 recommended to use ReturnCurrency to avoid sign issues
  4. Pre-initialization: Class automatically builds lookup table during initialization, no manual call needed
  5. 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

vb
' 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

VB6 and LOGO copyright of Microsoft Corporation