Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB6: RLE pakkaus

sooda [08.11.2003 13:12:08]

#

RLE pakkaa stringin. RLE on Run-Length Encoding (mitä sitten ikinä tarkoittaakaan) löysin jostain jotain ihan sekopäistä koodia ja muuttelin ja väänsin sitä toimivaksi ja tässä on. Pakkaa tekstiä rle alkoritmilla eli useammat merkit menee kahdeksi merkiksi: eka merkki selittää montako merkkiä on ja toka merkki on että mitä merkkejä on. esim "aaaaaaaaaaaaa" tekstin pakkaisi todella tehokkaasti mutta "sooda on hauska" ei pakkaantuisi niin hyvin koska siinä on niin paljon eri merkkejä. Jotkut kuvatiedostot käyttää tänlaista pakkausta kait PNG? en varma... kuvia tosiaan voi pakata hyvin jos niissä on paljon samanvärisiä pixeleitä. Bugeista saa sitten vapaasti ilmoitella... :P

Pakkaus

Sub Compress(DataIn As String, DataOut As String)

    Dim CharCount As Integer
    Dim NewChar As Integer
    Dim LastChar As Integer
    Dim CharLoop As Integer
    Dim CharPtr As Long
    Dim CharStrLen As Long
    Dim Compressed As String
    Dim MgrChar As Byte

    CharCount = -1
    CharStrLen = Len(DataIn)

    '+1 että vois kattoo kanssa viimisen erkki merkin
    For CharPtr = 1 To CharStrLen + 1
        'jos ei vika looppi, otetaan newchariin uus charakteri.
        'muuten  -1 meinaa että viiminen looooooooooooop
        If CharPtr < CharStrLen + 1 Then
            NewChar = Asc(Mid(DataIn, CharPtr, 1))
        Else
            NewChar = -1
        End If

        'yks siihen yhteensä laskuriin
        CharCount = CharCount + 1
        If CharPtr > 1 Then
            'sama merkki kun viimeks?
            If NewChar = LastChar Then
                'onks merkkejä niin paljon että yks manageri ei pysty
                'kertomaan enempää
                If CharCount = 128 Then
                    'jos on, niin se characteri saa "manageri tavun"
                    'laitetaa countti n0llaks(countteri aina yhen vähemmän kuin
                    'mitä merkkejä on)
                    MgrChar = 128
                    MgrChar = MgrChar Or 127
                    Compressed = Compressed & Chr(MgrChar) & Chr(LastChar)
                    'merkki laskuri nollaks
                    CharCount = 0
                End If
            Else
                'täll kertaa eri merkki elikkä katotaan onks enemmän kuin kaksi
                If CharCount > 2 Then
                    'enemmän kui kaksi elikkä manageria mukaan
                    MgrChar = 128
                    MgrChar = MgrChar Or (CharCount - 1)
                    'manageri ja merkki siihen ulostuloon
                    Compressed = Compressed & Chr(MgrChar) & Chr(LastChar)
                Else
                    'kaksi samaa muttei tarpeeks että käytettäs pakkausta turhaan
                    'koska siihenkin menee kaksi tavua

                    'pistä merkit outputtiin
                    For CharLoop = 1 To CharCount
                        'onks bittei enemmän kun arvon 127 muuten voitas sekottaa
                        'erikoismerkki manageriin
                        If LastChar > 127 Then
                            outchar = 128
                            outchar = outchar Or (CharCount - 1)
                            Compressed = Compressed & Chr(MgrChar) & Chr(LastChar)
                        Else
                            'ei oo liian iso merkki joten normaalisti mukaan
                            Compressed = Compressed & Chr(LastChar)
                        End If
                    Next CharLoop
                End If
                'resetataan charricountti
                CharCount = 0
            End If
        End If
        'viimeks luettu on uus tästä lähin että ihmetarkistus toimis ens kerralla
        LastChar = NewChar
    Next CharPtr
    DataOut = Compressed 'valmista! Huhhuh.

End Sub

Purku

Sub UnCompress(DataIn As String, DataOut As String)

    Dim NewChar As Byte
    Dim CharCount As Integer
    Dim CharPtr As Long
    Dim UnCompressed As String
    CharPtr = 0
    Do
        'yks lisää
        CharPtr = CharPtr + 1
        NewChar = Asc(Mid(DataIn, CharPtr, 1))
        'monta merkkiä pakattuna?
        If NewChar > 127 Then
            'oke manageri löytyi...

            'montaks pakattua merkkiä?
            CharCount = (NewChar And 127) + 1
            'seuraava
            CharPtr = CharPtr + 1
            NewChar = Asc(Mid(DataIn, CharPtr, 1))
            'puretaan pakkaus
            UnCompressed = UnCompressed & String(CharCount, NewChar)
        Else
            'vaan yks merkki, pyh...
            UnCompressed = UnCompressed & Chr(NewChar)
        End If
    'katellaan kunnes vika merkki
    Loop Until (CharPtr >= Len(DataIn))

    'valmista
    DataOut = UnCompressed

End Sub

Jogge [08.11.2003 18:35:28]

#

PNG ei ainakaan käytä RLE-pakkausta. Sen sijaan PCX-tiedostoissa sitä käytetään.

tuomas [16.05.2004 20:56:48]

#

Sattuuko kukaan tietämään minkälaista pakkausta käyttää winzip?
Onko kyseinen pakkaus menetelmä heidän omansa ja voiko jostain löytää koodia?

sooda [23.05.2004 18:57:38]

#

varmaan zippauspakkausta :D noh, google varmaan auttaa enemmän, itse en tiä. etsi vaikka "zip file packing method" tms sanoilla...

miiro [05.01.2005 12:46:52]

#

mutta tää ei toimi kunnolla...esim jos tekstissä on ääkkösiä niin se katkasee siitä ja heti.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta