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


What We Should Expect from Cell Phone Tech in the Near Future
The earliest cell phones included boxy designs full of buttons and antennas, and they only made calls. Needless to say, we’ve come a long way from those classic brick phones