VBcoders Guest



Don't have an account yet? Register
 


Forgot Password?



RLE : Run Length Encoding on files

by Julien Lecomte (4 Submissions)
Category: Files/File Controls/Input/Output
Compatability: Visual Basic 5.0
Difficulty: Unknown Difficulty
Originally Published: Sat 6th May 2000
Date Added: Mon 8th February 2021
Rating: (1 Votes)

RLE : Run Length Encoding on files

Rate RLE : Run Length Encoding on files




'RLE
'Run Length Encoding module
'Made by Julien Lecomte
'[email protected]
'http://thunder.prohosting.com/~jagsite
'Feel free to modify for personal use
'Feel free to distribute
'Don't take credit for what you didn't create.
'
'
'Format of Compressed File
'[1] = Size of Original FileName (byte)
'[x] = Original FileName
'[1] = File Attributes (byte)
'[4] = Size of original file (dword)
'[x] = data block
'
'RLE data block
'[2] = Header (word)
'[x] = FileData
'
'*******************************************************************************************
'Compress
'Input:  sFileInputName = Path of file to encode
'        sFileOutputName = Path of output file
'Output: True for success
Public Function Compress(ByVal sFileInputName As String, ByVal sFileOutputName As String) As Boolean
    Const iDataCompressed As Integer = &HF000
    Dim byLengthOfTitle   As Byte
    Dim byFileAttributes  As Byte
    Dim byBufferFirst     As Byte
    Dim byBufferLast      As Byte
    Dim iBufferData%
    Dim sFileTitle$
    Dim lFileSize&
    Dim lFileInputPointer&
    Dim lFileInputNumber&
    Dim lFileOutputPointer&
    Dim lFileOutputNumber&
    
On Error Resume Next
    Kill sFileOutputName

On Error GoTo ErrCompress
    'Get File Title
    sFileTitle = StrReverse(sFileInputName)
    byLengthOfTitle = InStr(1, sFileTitle, "\", vbTextCompare) - 1
    sFileTitle = Right$(sFileInputName, byLengthOfTitle)
    
    'Get attributes and size
    byFileAttributes = GetAttr(sFileInputName)
    lFileSize = FileLen(sFileInputName)
    
    'Open files
    lFileInputNumber = FreeFile
    Open sFileInputName For Binary Access Read As lFileInputNumber
    lFileOutputNumber = FreeFile
    Open sFileOutputName For Binary Access Write As lFileOutputNumber

    'Store Header
    Put lFileOutputNumber, , byLengthOfTitle
    Put lFileOutputNumber, , sFileTitle
    Put lFileOutputNumber, , byFileAttributes
    Put lFileOutputNumber, , lFileSize
    
    'Read file and analyze
    lFileInputPointer = 0
    lFileOutputPointer = Seek(lFileOutputNumber)
    Do
        Get lFileInputNumber, , byBufferFirst
        Get lFileInputNumber, , byBufferLast
        
        If byBufferFirst = byBufferLast Then
            'Compression
            iBufferData = iDataCompressed + 1
            
            Do
                iBufferData = iBufferData + 1
                Get lFileInputNumber, , byBufferLast
            Loop While byBufferLast = byBufferFirst And Not ( _
                       iBufferData = &HFFFF Or _
                       Seek(lFileInputNumber) >= lFileSize)
            
            Put lFileOutputNumber, , iBufferData
            Put lFileOutputNumber, , byBufferFirst
            
            lFileInputPointer = Seek(lFileInputNumber) - 1
            Seek lFileInputNumber, lFileInputPointer
            
        Else
            'No Compression
            iBufferData = 0
            lFileOutputPointer = Seek(lFileOutputNumber)
            Put lFileOutputNumber, , iBufferData
            Do
                iBufferData = iBufferData + 1
                Put lFileOutputNumber, , byBufferFirst
                byBufferFirst = byBufferLast
                Get lFileInputNumber, , byBufferLast
            Loop Until byBufferLast = byBufferFirst Or _
                       iBufferData = &HEFFF Or _
                       Seek(lFileInputNumber) >= lFileSize
                       
            'Correct error if EOF
            If EOF(lFileInputNumber) Then ' Seek(lFileInputNumber) >= lFileSize Then
                iBufferData = iBufferData + 1
                lFileInputPointer = Seek(lFileInputNumber)
                Seek lFileInputNumber, lFileSize
                Get lFileInputNumber, , byBufferLast
                Put lFileOutputNumber, , byBufferLast
                Seek lFileInputNumber, lFileInputPointer
            End If
            
            Seek lFileOutputNumber, lFileOutputPointer
            Put lFileOutputNumber, , iBufferData
            
            lFileOutputPointer = LOF(lFileOutputNumber) + 1
            Seek lFileOutputNumber, lFileOutputPointer

            lFileInputPointer = Seek(lFileInputNumber) - 2
            Seek lFileInputNumber, lFileInputPointer

        End If
    Loop Until Seek(lFileInputNumber) >= lFileSize
    
    Close lFileInputNumber
    Close lFileOutputNumber
    Compress = True
Exit Function
ErrCompress:
On Error Resume Next
    Close lFileInputNumber
    Close lFileOutputNumber
    Compress = False
End Function

'*******************************************************************************************
'GetCompressedFileAttrib
'Input:  sFileCompressedName = Path of compressed file
'        spFileTitle = pointer to string title of file
'        bypFileAttributes = pointer to byte attributes of file
'        lpFileSize = pointer to long file size
'Output: Length of sFileTitle
Public Function GetCompressedFileAttrib(ByVal sFileCompressedName As String, ByRef spFileTitle As String, ByRef bypFileAttributes As Byte, ByRef lpFileSize As Long) As Long
    Dim byLengthOfTitle   As Byte
    Dim byFileAttributes  As Byte
    Dim sFileTitle$
    Dim lFileSize&
    Dim lFileCompressedPointer&
    Dim lFileCompressedNumber&

On Error GoTo ErrGetCompressedFileAttrib
    
    'Open files
    lFileCompressedNumber = FreeFile
    Open sFileCompressedName For Binary Access Read As lFileCompressedNumber

    'Store Header
    Get lFileCompressedNumber, , byLengthOfTitle
    sFileTitle = Space$(byLengthOfTitle)
    Get lFileCompressedNumber, , sFileTitle
    Get lFileCompressedNumber, , byFileAttributes
    Get lFileCompressedNumber, , lFileSize
    
    GetCompressedFileAttrib = byLengthOfTitle
    spFileTitle = sFileTitle
    bypFileAttributes = byFileAttributes
    lpFileSize = lFileSize
    
    Exit Function
ErrGetCompressedFileAttrib:
On Error Resume Next
    Close lFileCompressedNumber
End Function


'*******************************************************************************************
'Decompress
'Input:  sFileInputName = Path of file to deencode
'        sFileOutputName = Path of output file
'Output: True for success
Public Function Decompress(ByVal sFileInputName As String, ByVal sFileOutputName As String) As Boolean
    Const iDataCompressed As Integer = &HF000
    Dim byLengthOfTitle   As Byte
    Dim byFileAttributes  As Byte
    Dim byBuffer          As Byte
    Dim iCompressCounter%
    Dim iCompressCounterTo%
    Dim iBufferData%
    Dim sFileTitle$
    Dim lFileSize&
'    Dim lFileInputPointer&
    Dim lFileInputNumber&
'    Dim lFileOutputPointer&
    Dim lFileOutputNumber&
    
'On Error GoTo ErrDecompress
    'Open files
    lFileInputNumber = FreeFile
    Open sFileInputName For Binary Access Read As lFileInputNumber
    lFileOutputNumber = FreeFile
    Open sFileOutputName For Binary Access Write As lFileOutputNumber

    'Store Header
    Get lFileInputNumber, , byLengthOfTitle
    sFileTitle = Space$(byLengthOfTitle)
    Get lFileInputNumber, , sFileTitle
    Get lFileInputNumber, , byFileAttributes
    Get lFileInputNumber, , lFileSize
    
    'Read file and analyze
    Do
        Get lFileInputNumber, , iBufferData
        
        If iBufferData And iDataCompressed Then
            iCompressCounterTo = (iBufferData - iDataCompressed)
            Get lFileInputNumber, , byBuffer
            For iCompressCounter = 1 To iCompressCounterTo
                Put lFileOutputNumber, , byBuffer
            Next
        Else
            For iCompressCounter = 1 To iBufferData
                Get lFileInputNumber, , byBuffer
                Put lFileOutputNumber, , byBuffer
            Next
        End If
    Loop Until EOF(lFileInputNumber)
    
    Close lFileInputNumber
    Close lFileOutputNumber
    Decompress = True
Exit Function
ErrDecompress:
On Error Resume Next
    Close lFileInputNumber
    Close lFileOutputNumber
    Decompress = False
End Function



Download this snippet    Add to My Saved Code

RLE : Run Length Encoding on files Comments

No comments have been posted about RLE : Run Length Encoding on files. Why not be the first to post a comment about RLE : Run Length Encoding on files.

Post your comment

Subject:
Message:
0/1000 characters