RLEUncompress – Uncompress data compressed using RLECompress

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As _    Any, source As Any, ByVal Bytes As Long)' Uncompress a block of data compressed with RLECompress'' Returns TRUE if successful (this version either returns True or raises an ' error)'' ADDRESS points to the buffer that holds the compressed data'      use StrPtr(s) if it's a string, VarPtr(arr(0)) if it's an array' BYTES is the size of the compressed data'      use LenB(s) if it's a string, N * LenB(arr(0)) if it's an array' OUTBUFFER is an array of bytes that will receive the uncompressed dataFunction RLEUncompress(ByVal address As Long, ByVal Bytes As Long, _    outBuffer() As Byte) As Boolean    Dim ItemSize As Integer    Dim outBytes As Long    Dim inIndex As Long    Dim outIndex As Long    Dim i As Long    Dim prevValue As Currency    Dim currValue As Currency    Dim matchCount As Integer        ' get the signature, exit if not matching    CopyMemory ItemSize, ByVal address, 2    If ItemSize <> &HABCD Then        Err.Raise 5, , "This hasn't been compressed with RLECompress"    End If    ' get ItemSize, exit if invalid    CopyMemory ItemSize, ByVal address + 2, 2    If ItemSize <> 1 And ItemSize <> 2 And ItemSize <> 4 And ItemSize <> 8 Then        Err.Raise 5, , "Wrong value for ItemSize"    End If    ' get the length of the uncompressed data    CopyMemory outBytes, ByVal address + 4, 4        ' prepare the output buffer    ReDim outBuffer(0 To outBytes - 1) As Byte        ' get the first value    CopyMemory prevValue, ByVal address + 8, ItemSize    address = address + 8 + ItemSize    ' copy to the output buffer as-is    CopyMemory outBuffer(0), prevValue, ItemSize    outIndex = ItemSize        ' repeat until the output buffer is full    Do While outIndex < outBytes        ' get the next value from the input buffer        CopyMemory currValue, ByVal address, ItemSize        address = address + ItemSize        ' move to the output buffer        CopyMemory outBuffer(outIndex), currValue, ItemSize        outIndex = outIndex + ItemSize                If prevValue = currValue Then            ' two consecutive values are equal            ' extract the matchCount value            CopyMemory matchCount, ByVal address, 2            address = address + 2            ' replicate the value that number of times            For i = 3 To matchCount                ' move to the output buffer                CopyMemory outBuffer(outIndex), currValue, ItemSize                outIndex = outIndex + ItemSize            Next        Else            prevValue = currValue        End If    Loop        ' signal success    RLEUncompress = TrueEnd Function

Share the Post:
Share on facebook
Share on twitter
Share on linkedin

Overview

Recent Articles: