Das hier hab ich auch schon probiert bei mir ^^ Aber da werden nur die ersten paar KB schneller geschrieben... der rest wieder auf gewohntem Schneckentempo.
Code: Alles auswählen
For i = 256 To WordBookIndex ;4095
mfg.
FlowPX2
Code: Alles auswählen
For i = 256 To WordBookIndex ;4095
Code: Alles auswählen
Wert1.w = ByteA
Wert2.w = ByteB
Code: Alles auswählen
DisableDebugger
#SourceFile=0
#EndFile=1
Procedure.s Compress(FromFile.s,ToFile.s)
;Dateien öffnen
OpenFile(#SourceFile,FromFile.s)
OpenFile(#EndFile,ToFile.s)
;Wörter Buch
; Dim WordBook.s(4096)
Dim NumWordBook(4095)
For i = 0 To 255
; WordBook.s(i) = Str(i)
NumWordBook(i) = i
Next
;Byte und Word Variablen
Global Wert1.w = 0
Global Wert2.w = 0
Global Byte1.b = 0
Global Byte2.b = 0
Global Byte3.b = 0
Global Result.l = 0
WordBookIndex = 256
WordBookExist = 0
;Zu komprimierende Datei laden
SourceFileSize = FileSize(FromFile.s)+1
Dim SourceBytes(SourceFileSize)
LoadCurPos = 0
Repeat
SourceBytes(LoadCurPos.l) = ReadByte(#SourceFile)&$FF
LoadCurPos +1
Until Eof(#SourceFile)
CurPos.l = 0
dummy.w = 0
Repeat
WriteInFile = WriteInFile + 1
ByteA.b = SourceBytes(CurPos.l)
ByteB.b = SourceBytes(CurPos.l+1)
WordBookExist = 0
dummy = ByteA * 256 + ByteB
;Prüfe ob in Wörterbuch schon vorhanden
For i = 256 To WordBookIndex-1
; If WordBook(i) = Str(ByteA)+Str(ByteB)
If NumWordBook(i) = dummy
If WriteInFile = 1
Wert1.w = i
Else
Wert2.w = i
EndIf
WordBookExist = 1
CurPos +1 ;Wenn im Wörterbuch vorhanden, dann nächstes Byte nicht nochmal verarbeiten
Break
EndIf
Next
If WordBookExist = 0
;Wenn nicht im Wörterbuch vorhanden
If WordBookIndex < 4096
; WordBook(WordBookIndex) = Str(ByteA)+Str(ByteB)
NumWordBook(WordBookIndex) = ByteA * 256 + ByteB
WordBookIndex = WordBookIndex + 1
EndIf
If WriteInFile = 1
Wert1.w = ByteA
Else
Wert2.w = ByteA
EndIf
EndIf
;Schreibe in Datei wenn genug Bits da sind um 3Bytes zu füllen
If WriteInFile = 2
!MOVZX Eax,[v_Wert1]
!MOV dx,[v_Wert2]
!SHL Edx,12
!OR Eax,Edx
!MOV [v_Result],Eax
!MOV [v_Byte2],ah
!MOV [v_Byte3],al
!SHR Eax,8
!MOV [v_Byte1],ah
;Schreibe kompremierte version in Datei
WriteByte(#EndFile,Byte1.b&$FF);
WriteByte(#EndFile,Byte2.b&$FF);
WriteByte(#EndFile,Byte3.b&$FF);
WriteInFile = 0
EndIf
CurPos + 1
Until CurPos >= SourceFileSize
ProcedureReturn RetVal.s
EndProcedure
Start = gettickcount_()
Compress("C:\Test.wav","C:\Test.dat")
Zeit = gettickcount_()-Start
MessageRequester("verstrichene Zeit",Str(Zeit)+" ms")
Code: Alles auswählen
;Prüfe ob in Wörterbuch schon vorhanden
Endloop = WordBookIndex -1
For i = 256 To Endloop