Skip to content

Tools - CRC Calculation Class

Class File: src\Tools\Crc\cToolsCrc.cls


Overview

cToolsCrc is a CRC16/32 calculation class that supports bit-by-bit calculation and table lookup methods. It uses a fluent/chaining design for easy consecutive method calls.

Features:

  • Supports CRC16-Modbus calculation (polynomial 0xA001)
  • Supports CRC32 calculation (polynomial 0xEDB88320, IEEE 802.3)
  • Method chaining support (each calculation function returns its own instance)
  • Multiple data input methods (byte array, HEX string, text string)
  • Multiple result output formats (Long, Currency, byte array, Hex string)

Enumerations

CRCType Enum

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

CRCDataType Enum

vb
Public Enum CRCDataType
    DataType_ByteArray = 0   ' Byte array
    DataType_HexString = 1   ' HEX string (automatically handles spaces)
    DataType_Text = 2        ' Text string
End Enum

Methods

Data (Default Member)

Sets data to the internal buffer for subsequent calculations. This method is the default member of the class and can be omitted.

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

Parameters:

ParameterTypeDescription
DataTypeCRCDataTypeData type (optional, defaults to byte array)
ContentVariantData content

DataType Description:

TypeValueDescription
DataType_ByteArray0Byte array (Byte())
DataType_HexString1HEX string, automatically handles spaces, dashes, colons, etc.
DataType_Text2Text string, automatically converted to ANSI byte array

Return Value:

Returns cToolsCrc instance, supporting method chaining.

Example:

vb
Dim CRC As New cToolsCrc
Dim CRCValue As Long

' ========== Method 1: Byte array (can omit DataType parameter) ==========
Dim Bytes() As Byte
Bytes = StrConv("Hello World", vbFromUnicode)
CRCValue = CRC.Data(DataType_ByteArray, Bytes).CalculateCRC16.ReturnLong()
' Or omit Data method name (default member)
CRCValue = CRC(DataType_ByteArray, Bytes).CalculateCRC16.ReturnLong()

' ========== Method 2: HEX string ==========
Dim HexStr As String
HexStr = "48 65 6C 6C 6F"  ' HEX of "Hello"
CRCValue = CRC(DataType_HexString, HexStr).CalculateCRC16.ReturnLong()

' Supports multiple delimiter formats
CRC(DataType_HexString, "48-65-6C-6C-6F").CalculateCRC16.ReturnLong()
CRC(DataType_HexString, "48:65:6C:6C:6F").CalculateCRC16.ReturnLong()
CRC(DataType_HexString, "48656C6C6F").CalculateCRC16.ReturnLong()

' ========== Method 3: Text string ==========
Dim Text As String
Text = "Hello World"
CRCValue = CRC(DataType_Text, Text).CalculateCRC16.ReturnLong()

CalculateCRC16

Calculates CRC16 (bit-by-bit calculation method) based on polynomial 0xA001 (CRC16-Modbus).

Note: You must call the Data method to set data first.

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

Parameters:

ParameterTypeDescription
StartIndexLongStarting index (optional, defaults to 0)
LengthLongData length (optional, defaults to -1 meaning calculate to end of array)

Return Value:

Returns cToolsCrc instance, supporting method chaining.

Example:

vb
Dim CRC As New cToolsCrc
Dim CRCValue As Long

' ========== Byte array method ==========
Dim Bytes() As Byte
Bytes = StrConv("Hello World", vbFromUnicode)
CRCValue = CRC(DataType_ByteArray, Bytes).CalculateCRC16.ReturnLong()
Debug.Print "CRC16: " & Hex$(CRCValue)  ' Output: CRC16: 3AFA

' ========== HEX string method ==========
CRCValue = CRC(DataType_HexString, "48 65 6C 6C 6F 20 57 6F 72 6C 64").CalculateCRC16.ReturnLong()

' ========== Text string method ==========
CRCValue = CRC(DataType_Text, "Hello World").CalculateCRC16.ReturnLong()

Calculate Partial Data:

vb
' Only calculate first 5 bytes (Hello)
Dim CRCValue As Long
CRCValue = CRC(DataType_Text, "Hello World").CalculateCRC16(0, 5).ReturnLong()

ReturnLong

Returns the CRC value as Long type.

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

Parameters:

ParameterTypeDescription
CRCTypeValueCRCTypeCRC type (optional, defaults to CRC16)

Description:

  • CRC16 returns unsigned 16-bit value (0-65535)
  • CRC32 returns Long type (negative if greater than 2147483647)
  • For unsigned 32-bit results, use ReturnCurrency or ReturnHex

Example:

vb
' CRC16
Dim CRC16Value As Long
CRC16Value = CRC.CalculateCRC16(Data).ReturnLong(CRC16)

' CRC32
Dim CRC32Value As Long
CRC32Value = CRC.CalculateCRC32(Data).ReturnLong(CRC32)

ReturnCurrency

Returns the CRC32 value as Currency type (unsigned 32-bit).

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

Parameters:

ParameterTypeDescription
CRCTypeValueCRCTypeCRC type (optional, defaults to CRC16)

Description:

  • CRC32 returns positive number from 0 to 4294967295
  • CRC16 returns 0 to 65535

Example:

vb
Dim CRC32Value As Currency
CRC32Value = CRC.CalculateCRC32(Data).ReturnCurrency(CRC32)
Debug.Print "CRC32: " & CRC32Value  ' Output: CRC32: 1243062890

ReturnBytes

Returns the CRC value as a byte array (high byte first).

vb
Public Function ReturnBytes(Optional ByVal CRCTypeValue As CRCType = CRC16) As Byte()

Parameters:

ParameterTypeDescription
CRCTypeValueCRCTypeCRC type (optional, defaults to CRC16)

Return Value:

  • CRC16 returns 2-byte array (high byte first)
  • CRC32 returns 4-byte array (high byte first)

Example:

vb
Dim Result() As Byte
Result = CRC.CalculateCRC16(Data).ReturnBytes()

' Result(0) = High byte
' Result(1) = Low byte
Debug.Print "Bytes: " & Hex$(Result(0)) & " " & Hex$(Result(1))

ReturnHex

Returns the CRC value as a hexadecimal string (uppercase).

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

Parameters:

ParameterTypeDescription
CRCTypeValueCRCTypeCRC type (optional, defaults to CRC16)

Return Value:

  • CRC16 returns 4-character uppercase string (e.g., "B001")
  • CRC32 returns 8-character uppercase string (e.g., "A1B2C3D4")

Example:

vb
Dim HexValue As String
HexValue = CRC.CalculateCRC16(Data).ReturnHex()
Debug.Print "CRC16: " & HexValue  ' Output: CRC16: 3AFA

' CRC32
Dim CRC32Hex As String
CRC32Hex = CRC.CalculateCRC32(Data).ReturnHex(CRC32)
Debug.Print "CRC32: " & CRC32Hex  ' Output: CRC32: 4A17B156

ReturnHexString

Returns a hexadecimal string with separators (suitable for display).

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

Parameters:

ParameterTypeDescription
CRCTypeValueCRCTypeCRC type (optional, defaults to CRC16)
SeparatorStringSeparator character (optional, defaults to space)

Return Value:

  • CRC16 e.g., "B0 01"
  • CRC32 e.g., "A1 B2 C3 D4"

Example:

vb
Dim HexStr As String

' Default space separator
HexStr = CRC.CalculateCRC16(Data).ReturnHexString()
Debug.Print HexStr  ' Output: 3A FA

' Custom separator
HexStr = CRC.CalculateCRC16(Data).ReturnHexString(CRC16, "-")
Debug.Print HexStr  ' Output: 3A-FA

' CRC32
HexStr = CRC.CalculateCRC32(Data).ReturnHexString(CRC32, ":")
Debug.Print HexStr  ' Output: 4A:17:B1:56

Complete Example

vb
Private Sub CRCDemo()
    Dim CRC As New cToolsCrc
    Dim Data() As Byte
    Dim CRCValue As Long
    Dim HexResult As String
    
    ' ========== Method 1: Byte array method ==========
    
    Data = StrConv("Hello World", vbFromUnicode)
    
    ' Return Long
    CRCValue = CRC(DataType_ByteArray, Data).CalculateCRC16.ReturnLong()
    Debug.Print "CRC16 (Long): " & CRCValue
    
    ' Return Hex string
    HexResult = CRC(DataType_ByteArray, Data).CalculateCRC16.ReturnHex()
    Debug.Print "CRC16 (Hex): " & HexResult
    
    ' Return Hex with separators
    HexResult = CRC(DataType_ByteArray, Data).CalculateCRC16.ReturnHexString(CRC16, "-")
    Debug.Print "CRC16 (Formatted): " & HexResult
    
    ' ========== Method 2: HEX string method ==========
    
    ' Use HEX string (automatically handles spaces)
    HexResult = CRC(DataType_HexString, "48 65 6C 6C 6F 20 57 6F 72 6C 64").CalculateCRC16.ReturnHex()
    Debug.Print "CRC16 from HEX: " & HexResult
    
    ' Use HEX without spaces
    HexResult = CRC(DataType_HexString, "48656C6C6F20576F726C64").CalculateCRC16.ReturnHex()
    Debug.Print "CRC16 from HEX (no space): " & HexResult
    
    ' Use dash separator
    HexResult = CRC(DataType_HexString, "48-65-6C-6C-6F-20-57-6F-72-6C-64").CalculateCRC16.ReturnHex()
    Debug.Print "CRC16 from HEX (dash): " & HexResult
    
    ' ========== Method 3: Text string method ==========
    
    ' Use text directly (automatically converted to byte array)
    HexResult = CRC(DataType_Text, "Hello World").CalculateCRC16.ReturnHex()
    Debug.Print "CRC16 from Text: " & HexResult
    
    ' ========== Method 4: Method chaining (default member syntax) ==========
    
    ' Most concise usage: CRC(DataType, Content).Calculate.Return
    Debug.Print CRC(DataType_Text, "Test").CalculateCRC16.ReturnHex()
    
    ' ========== Partial data calculation example ==========
    
    ' Only calculate first 5 bytes
    Dim PartialCRC As Long
    PartialCRC = CRC(DataType_Text, "Hello World").CalculateCRC16(0, 5).ReturnLong()
    Debug.Print "CRC16 of 'Hello': " & Hex$(PartialCRC)
    
    ' Calculate from 6th byte
    PartialCRC = CRC(DataType_Text, "Hello World").CalculateCRC16(6).ReturnLong()
    Debug.Print "CRC16 of 'World': " & Hex$(PartialCRC)
    
    ' ========== Practical example: Calculate CRC for Modbus RTU frame ==========
    
    ' Modbus RTU request frame: 01 03 00 00 00 0A
    Dim ModbusFrame As String
    Dim ModbusCRC As String
    
    ModbusFrame = "01 03 00 00 00 0A"
    ModbusCRC = CRC(DataType_HexString, ModbusFrame).CalculateCRC16.ReturnHexString(CRC16, " ")
    Debug.Print "Modbus CRC: " & ModbusCRC  ' Output: Modbus CRC: C5 CD
    
    ' Complete Modbus frame
    Debug.Print "Complete Frame: " & ModbusFrame & " " & ModbusCRC
End Sub

Technical Specifications

CRC16 Parameters

ParameterValue
Polynomial0xA001 (CRC16-Modbus)
Initial Value0xFFFF
Input ReflectedYes
Output ReflectedYes
Final XOR0x0000

CRC32 Parameters

ParameterValue
Polynomial0xEDB88320 (IEEE 802.3)
Initial Value0xFFFFFFFF
Input ReflectedYes
Output ReflectedYes
Final XOR0xFFFFFFFF

Notes

  1. Data Type: CRC32 calculation uses Currency type to avoid VB6's Long type sign bit issues (supports unsigned 32-bit)
  2. Byte Order: All methods returning byte arrays use big-endian (high byte first)
  3. Thread Safety: Each CRC calculation instance is independent and can be used in multi-threaded environments (ensure VB6 thread safety)
  4. Performance: Table-Driven method is about 8x faster than bit-by-bit calculation, suitable for large data processing
  5. Default Member: The Data method is the default member of the class and can be called without the method name, e.g., CRC(DataType_Text, "Hello") is equivalent to CRC.Data(DataType_Text, "Hello")
  6. HEX String: DataType_HexString type automatically removes common separators like spaces, dashes, colons, supporting multiple formats

VB6 and LOGO copyright of Microsoft Corporation