Ich habe mir eine Funktion geschrieben um binär eingebundene Dateien zu komprimieren. Die binären Strings enthalten meist Unmengen von langen homogenen Zeichenketten, die werden dann komprimiert. Die Geschwindigkeit des Komprimierens ist annehmbar. Die Methode schrumpft die Strings auf ca 70% ihrer alten Größe.
Allerdings ist das Dekomprimieren saulangsam. Obwohl die Funktion auf das Wesentliche reduziert ist, braucht es bis zu 4 Minuten um eine 100KB Datei zu "entpacken". Wie kann ich das Entpacken beschleunigen? Ich möchte nicht auf eine ZIP Kompression oder irgendeine UDF umsteigen, das ist dann widersinnig, da das Skript nur größer würde als vorher. Hier mal ein Testskript:
Spoiler anzeigen
;$sTest = "67B666666B76000000000000000000056B66666666B650000000000000000056B666666666676500000000000000006676666666666766000000000000000566666666666666665000000000000006666666666666666660000000000000566666666666666666650000000000005666666666666667666500000000000056677676767676767665000000000000566B777777777777B665000000000000566B7B777777777BB665000000000000066BBB7B7B7BB7BBD650000000000000056BDBBBBBBBBBBD76500000000000000056BDDDBDBDBDDD660000000000000000366BEDDDDDDEB655000000000000000005567BDEEDB76550000000000000000000055666666550000000000000000000000005555550000000000000FFFFFFFFFFFE7FFFFFF81FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFE007FFFFE007FFFFE007FFFFC003FFFFC003FFFFC003FFFFC003FFFF8001FFFF0000FFFF0000FFFE00007FFE00007FFC00003FFC00003FFC00003FFC00003FFC00003FFE00007FFE00007FFF0000FFFF0000FFFF8001FFFFE007FFFFF81FFF00000000F26A0451000000000000010000000000800300009053040030010000B0040000000000002800000020000000400000000100010000000000000100000000000000000000000000000000000000000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1FFFFFC3C7FFFC3FC1FF83FFC07FBFFFC1FFBFFFC7FFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFC1FFFBFC3DFFFBC3C1FFF83C3FFFFBC3FFFFF83FFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1FFFFFC007FFFC0001FF8000007F800001FF800007FF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF8003FFFF803FFFFF83FFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000F26A0451000000000000010000000000D8040000E8540400E8020000B0040000000000002800000020000000400000000100040000000000800200000000000000000000000000000000000000000000"
$sTest = '67B[6:6]B76[0:19]56B[6:8]B65[0:17]56B[6:10]765[0:16]667[6:10]766[0:15]5[6:16]5[0:14][6:18][0:13]5[6:18]5[0:12]5[6:14]76665[0:12]56677676767676767665[0:12]566B[7:12]B665[0:12]566B7B[7:9]BB665[0:13]66BBB7B7B7BB7BBD65[0:14]56BD[B:10]D765[0:15]56BDDDBDBDBDDD66[0:16]366BE[D:6]EB655[0:17]5567BDEEDB7655[0:20]55[6:6]55[0:24][5:6][0:13][F:11]E7[F:6]81[F:6]00[F:6]00[F:6]00[F:6]00[F:6]00[F:5]E007FFFFE007FFFFE007FFFFC003FFFFC003FFFFC003FFFFC003FFFF8001FFFF0000FFFF0000FFFE00007FFE00007FFC00003FFC00003FFC00003FFC00003FFC00003FFE00007FFE00007FFF0000FFFF0000FFFF8001FFFFE007[F:5]81FFF[0:8]F26A0451[0:13]1[0:10]800300009053040030010000B004[0:12]28[0:6]2[0:7]4[0:8]10001[0:13]1[0:44][F:6]00[F:44]C1[F:5]C3C7FFFC3FC1FF83FFC07FBFFFC1FFBFFFC7FFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFC1FFFBFC3DFFFBC3C1FFF83C3FFFFBC3[F:5]83[F:6]B[F:98]C1[F:5]C007FFFC0001FF8[0:5]7F800001FF800007FF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF8003FFFF803[F:5]83[F:6]B[F:54][0:8]F26A0451[0:13]1[0:10]D8040000E8540400E8020000B004[0:12]28[0:6]2[0:7]4[0:8]10004[0:10]8002[0:44]'
;Compress_Binary($sTest)
Decompress($sTest)
; #FUNCTION# ====================================================================================================================
; Name ..........: Compress_Binary
; Description ...: Rudimentary binary compression
; Syntax ........: Compress_Binary($sString)
; Parameters ....: $sString - Binary String
; Return values .: Compressed String
; Author ........: minx
; ===============================================================================================================================
Func Compress_Binary($sString)
$OldLength = StringLen($sString)
Local $aChr[16] = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]
$SumLength = 0
For $i = 0 To 15; Finden der maximalen Länge um zusätzliche Schleifen zu vermeiden
$MaxSize = 0
Do
$MaxSize += 1
$State = StringInStr($sString, _($aChr[$i],$MaxSize))
Until $State = 0
If $MaxSize > $SumLength Then $SumLength = $MaxSize
Next
For $i = 0 To 15; Ersetzen der homogenen Strings. Von Groß nach Klein.
For $j = $SumLength To 5 Step -1
If StringInStr($sString, _($aChr[$i],$j)) Then
$sString = StringReplace($sString, _($aChr[$i],$j), "[" & $aChr[$i] & ":" & $j & "]" )
EndIf
Next
Next
$Perc = Round((StringLen($sString) / $OldLength)*100)
;$sString = "'"&$sString&"'"
ConsoleWrite("!> Compression: " & $Perc & "%" & @CRLF )
Return $sString
EndFunc
Func Decompress($a)
Local $b="(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)",$c=StringRegExp($a,"(?s)(?i)"&StringRegExpReplace("[",$b,"\\$1")&"(.*?)"&StringRegExpReplace("]",$b,"\\$1"),3)
For $i=0 To UBound($c)-1
$a=StringReplace($a,"["&$c[$i]&"]",_(StringLeft($c[$i],1),StringReplace($c[$i],StringLeft($c[$i],2),"")))
Next
Return $a
EndFunc
Func _($a,$b)
Local $c
For $i = 1 To $b
$c &= $a
Next
Return $c
EndFunc