Bytes zu 12 Bits und anders herum. (Fehlerhafter LZW Source)
- NicknameFJ
 - Beiträge: 324
 - Registriert: 03.06.2007 14:36
 - Wohnort: Von der Sonne aus gesehen der dritte Planet
 
@FlowPX2
Wenn es bei Dir mit .c nicht klappt kann es eigentlich nur daran liegen, dass Du das Prg. im Unicode Modus kompiliert hast.
.c ist eigentlich kein Datentyp für Byte sondern für Character und der hat in Unicode eben nicht 1 sondern 2 Byte
Grüße
Joachim
			
			
									
									Wenn es bei Dir mit .c nicht klappt kann es eigentlich nur daran liegen, dass Du das Prg. im Unicode Modus kompiliert hast.
.c ist eigentlich kein Datentyp für Byte sondern für Character und der hat in Unicode eben nicht 1 sondern 2 Byte
Grüße
Joachim
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

						
Ahh interessant.. Danke.. Da sieht man Unicode hat nicht nur vorteile *hehe*
Naja ich Quäle mich gerade jetzt damit ab das ganze jetzt auch rückwärts zum laufen zu bringen also... wenn ich 3 Bytes habe das ich 2 Word heraus bekomme... Werd mal herum probieren, das kann doch nicht so schwer sein
mfg.
FlowPX2
			
			
									
									
						Naja ich Quäle mich gerade jetzt damit ab das ganze jetzt auch rückwärts zum laufen zu bringen also... wenn ich 3 Bytes habe das ich 2 Word heraus bekomme... Werd mal herum probieren, das kann doch nicht so schwer sein
mfg.
FlowPX2
- NicknameFJ
 - Beiträge: 324
 - Registriert: 03.06.2007 14:36
 - Wohnort: Von der Sonne aus gesehen der dritte Planet
 
Ja danke ^^ Aber mit PureBasic programmiert hab ich damals schon nur mich nie im Forum angemeldet, da die Dokumentationen die es für PureBasic gibt recht gut geschrieben sind. 
Naja und jetzt versuch ich halt seit ein paar Tagen wieder was in PB zu coden, weil ich nen kleines PackFormat machen möchte mit einigen neuen Funktionen die es noch nicht gibt... halt nur nich soo eine gute kompremierung... Daher versuch ich mich gerade mal daran den LZW-Algo in PureBasic zu coden.
mfg.
FlowPX2
			
			
									
									
						Naja und jetzt versuch ich halt seit ein paar Tagen wieder was in PB zu coden, weil ich nen kleines PackFormat machen möchte mit einigen neuen Funktionen die es noch nicht gibt... halt nur nich soo eine gute kompremierung... Daher versuch ich mich gerade mal daran den LZW-Algo in PureBasic zu coden.
mfg.
FlowPX2
Erste probleme Geschaft ^^ Natürlich gleich mal hier ins Forum posten, weil vll. brauch es später mal jemand.
Also mit dem Code kann man 2Words zu 3Bytes umwandeln oder 3Bytes wieder zu 2Words ^^
Viel Spaß mit dem herum spielen, falls jemand es brauch... Und jetzt probier ich mal darauf die Komprimierung aufzubauen ^^ Ohje.
mfg.
FlowPX2
			
			
									
									
						Also mit dem Code kann man 2Words zu 3Bytes umwandeln oder 3Bytes wieder zu 2Words ^^
Code: Alles auswählen
;2Word welche zu 3Bytes umgewandelt werden sollen
Wert1.w = %100001110000    ;irgendwelche 12 Bits
Wert2.w = %011000000111
Byte1.b = 0
Byte2.b = 0
Byte3.b = 0
Result.l = 0
!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
Debug "Von Word to Byte"
Debug "Komplett  :  "+RSet(Bin(Result), 24, "0")
Debug "Byte 1:  "+RSet(Bin(Byte1&$FF), 8, "0")
Debug "Byte 2:  "+RSet(Bin(Byte2&$FF), 8, "0")
Debug "Byte 3:  "+RSet(Bin(Byte3&$FF), 8, "0")
Debug "Word1  :  "+RSet(Bin(Wert1), 12, "0")
Debug "Word2  :  "+RSet(Bin(Wert2), 12, "0")
Debug ""
Debug ""
;3Bytes welche zu 2Word umgewandelt werden sollen
;Byte1.b = 255
;Byte2.b = 0
;Byte3.b = 255
!mov ah,[v_Byte1]
!shl eax,8
!mov ah,[v_Byte2]
!mov al,[v_Byte3]
!mov edx,eax
!mov [v_Result],eax
!shr edx,12
!mov [v_Wert2],dx
!shl edx,12
!xor eax,edx
!mov [v_Wert1],ax
Debug "Von Byte to Word"
Debug "Komplett  :  "+RSet(Bin(Result), 24, "0")
Debug "Byte 1:  "+RSet(Bin(Byte1&$FF), 8, "0")
Debug "Byte 2:  "+RSet(Bin(Byte2&$FF), 8, "0")
Debug "Byte 3:  "+RSet(Bin(Byte3&$FF), 8, "0")
Debug "Word1  :  "+RSet(Bin(Wert1), 12, "0")
Debug "Word2  :  "+RSet(Bin(Wert2), 12, "0")
mfg.
FlowPX2
- NicknameFJ
 - Beiträge: 324
 - Registriert: 03.06.2007 14:36
 - Wohnort: Von der Sonne aus gesehen der dritte Planet
 
Also Dein Code gibt bei mir folgenden Output
Von Word to Byte
Komplett : 100000001100000011110000
Byte 1: 01100000
Byte 2: 01111000
Byte 3: 01110000
Word1 : 100001110000
Word2 : 011000000111
Von Byte to Word
Komplett : 111111010110000001111000
Byte 1: 01100000
Byte 2: 01111000
Byte 3: 01110000
Word1 : 100001110000
Word2 : 111111111111
Wenn ich mir hier das Ergebnis von Byte nach Word ansehe - hier WORD2 - da sind aber viele Einsen
 
Habe jetzt nur keine Lust mehr - *müde er ist* - mir Deinen Code anzusehen, aber so auf die schnelle, da hackt noch was
Nur mal so zum Verständnis:
In Deinem ersten Posting hast Du geschrieben, dass Du zwei ByteWerte (=zusammen 16 Bit) zu 24 Bit expandieren willst. Danach war immer die Rede davon, zwei 12 Bit-Werte zu 24 Bit aneinander zu reihen - was ist den wirklich gewünscht ???
			
			
									
									Von Word to Byte
Komplett : 100000001100000011110000
Byte 1: 01100000
Byte 2: 01111000
Byte 3: 01110000
Word1 : 100001110000
Word2 : 011000000111
Von Byte to Word
Komplett : 111111010110000001111000
Byte 1: 01100000
Byte 2: 01111000
Byte 3: 01110000
Word1 : 100001110000
Word2 : 111111111111
Wenn ich mir hier das Ergebnis von Byte nach Word ansehe - hier WORD2 - da sind aber viele Einsen
Habe jetzt nur keine Lust mehr - *müde er ist* - mir Deinen Code anzusehen, aber so auf die schnelle, da hackt noch was
Nur mal so zum Verständnis:
In Deinem ersten Posting hast Du geschrieben, dass Du zwei ByteWerte (=zusammen 16 Bit) zu 24 Bit expandieren willst. Danach war immer die Rede davon, zwei 12 Bit-Werte zu 24 Bit aneinander zu reihen - was ist den wirklich gewünscht ???
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

						
Gewünscht ist Folgendes:
1. Lese ich aus einer Datei 2 Bytes heraus... also 16bit
2. Prüfe ich ob diese reihenfolge im Wörterbuch steht.
3. Wenn ja dann werden die 2 Bytes also 16bit durch 2 Zahlen ersetzt welche ins gesammt 24bit brauchen also 3bytes. Also 2 Zahlen die von 0 bis 4095 gehen und daher 12bits brauchen ^^
Also die zahlen 12, 16 und 24 bits sind gefallen ^^ und auch alle davon benötige ich leider
komisch das Problem das du hast das alles voll mit 1 ist bei Word2 tritt bei mir wiederrum nicht auf... mal schauen vll. find ich ein fehler.
mfg.
FlowPX2
			
			
									
									
						1. Lese ich aus einer Datei 2 Bytes heraus... also 16bit
2. Prüfe ich ob diese reihenfolge im Wörterbuch steht.
3. Wenn ja dann werden die 2 Bytes also 16bit durch 2 Zahlen ersetzt welche ins gesammt 24bit brauchen also 3bytes. Also 2 Zahlen die von 0 bis 4095 gehen und daher 12bits brauchen ^^
Also die zahlen 12, 16 und 24 bits sind gefallen ^^ und auch alle davon benötige ich leider
komisch das Problem das du hast das alles voll mit 1 ist bei Word2 tritt bei mir wiederrum nicht auf... mal schauen vll. find ich ein fehler.
mfg.
FlowPX2
Hilfe!!! Was hab ich getan xDD
Also erstmal dachte ich es funktioniert... Weil eine Datei die 15kb hatte nur noch 12kb groß war. Doch dann hab ich eine Datei probiert die 328kb war... dannach war Sie 486kb groß! Dann hab ich Sie mir mal im Hex Editor angeschaut und bin mir jetzt sicher das es irgendwie total falsch läuft.
Hier das Skript... Es sollte eine Datei mit dem LZW Algo Komprimieren...
Aber es läuft der maßen lahm... also beim testen keine Files größer als 30kb nutzen.
Eventuell kennt jemand sich ja genauer mit LZW aus und/oder weiß was hier aber sowas von falsch funktioniert.
mfg.
FlowPX2
			
			
									
									
						Also erstmal dachte ich es funktioniert... Weil eine Datei die 15kb hatte nur noch 12kb groß war. Doch dann hab ich eine Datei probiert die 328kb war... dannach war Sie 486kb groß! Dann hab ich Sie mir mal im Hex Editor angeschaut und bin mir jetzt sicher das es irgendwie total falsch läuft.
Hier das Skript... Es sollte eine Datei mit dem LZW Algo Komprimieren...
Aber es läuft der maßen lahm... also beim testen keine Files größer als 30kb nutzen.
Code: Alles auswählen
#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)
For i = 0 To 255
WordBook.s(i) = Str(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
;Zu komprimierende Datei laden
SourceFileSize = FileSize(FromFile.s)+1
Dim SourceBytes(SourceFileSize)
Repeat
  LoadCurPos.l = Loc(#SourceFile)
  SourceBytes(LoadCurPos.l) = ReadByte(#SourceFile)&$FF
Until Eof(#SourceFile)
  CurPos.l = 0
  Repeat
    WriteInFile = WriteInFile + 1
    
    ByteA = SourceBytes(CurPos.l)     
    ByteB = SourceBytes(CurPos.l+1)
    Wert1.w = ByteA
    Wert2.w = ByteB
        
    ;Prüfe ob in Wörterbuch schon vorhanden
    For i = 256 To 4095
      If WordBook.s(i) = Str(ByteA)+Str(ByteB)
      
        ;Wenn im Wörterbuch vorhanden
        If WriteInFile = 1
        Wert1.w = i
        Else
        Wert2.w = i
        EndIf
        CurPos.l = CurPos.l + 1 ;Wenn im Wörterbuch vorhanden, dann nächstes Byte nicht nochmal verarbeiten
        
      Else
        
        ;Wenn nicht im Wörterbuch vorhanden
        If WordBookIndex < 4096
        WordBook(WordBookIndex) = Str(ByteA)+Str(ByteB)
        WordBookIndex = WordBookIndex + 1
        EndIf
        
        If WriteInFile = 1
        Wert1.w = ByteA
        Else
        Wert2.w = ByteA
        EndIf
        
      EndIf
    Next
    
    ;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.l = CurPos.l + 1
  Until CurPos = SourceFileSize
   
  ProcedureReturn RetVal.s 
EndProcedure 
Compress("C:\Program Files\Zak2\SDL.dll","C:\Program Files\Zak2\SDL.lzw") 
mfg.
FlowPX2
Eben beim Frühstück nur mal kurz draufgeschaut: Du musst unbedingt 
verwenden, sonst sind die oberen 4 Bits von EDX unbestimmt. Gilt hier für Result, was aber im Code nicht weiterverwendet wird (Kontrollzwecke?).
Gruß
Helle
			
			
									
									
						Code: Alles auswählen
!movzx edx,[v_Wert2]
 Gruß
Helle
So müsste auch der andere Code funktionieren:
Gruß
Helle
			
			
									
									
						Code: Alles auswählen
;2Word welche zu 3Bytes umgewandelt werden sollen 
Wert1.w = %100001110000    ;irgendwelche 12 Bits 
Wert2.w = %011000000111 
Byte1.b = 0 
Byte2.b = 0 
Byte3.b = 0 
Result.l = 0 
!movzx eax,[v_Wert1] 
!movzx edx,[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 
Debug "Von Word to Byte" 
Debug "Komplett  :  "+RSet(Bin(Result), 24, "0") 
Debug "Byte 1:  "+RSet(Bin(Byte1&$FF), 8, "0") 
Debug "Byte 2:  "+RSet(Bin(Byte2&$FF), 8, "0") 
Debug "Byte 3:  "+RSet(Bin(Byte3&$FF), 8, "0") 
Debug "Word1  :  "+RSet(Bin(Wert1), 12, "0") 
Debug "Word2  :  "+RSet(Bin(Wert2), 12, "0") 
Debug "" 
Debug "" 
;3Bytes welche zu 2Word umgewandelt werden sollen 
;Byte1.b = 255 
;Byte2.b = 0 
;Byte3.b = 255 
!movzx eax,[v_Byte1] 
!shl eax,16 
!mov ah,[v_Byte2] 
!mov al,[v_Byte3] 
!mov edx,eax 
!mov [v_Result],eax 
!shr edx,12 
!mov [v_Wert2],dx 
!shl edx,12 
!xor eax,edx 
!mov [v_Wert1],ax 
Debug "Von Byte to Word" 
Debug "Komplett  :  "+RSet(Bin(Result), 24, "0") 
Debug "Byte 1:  "+RSet(Bin(Byte1&$FF), 8, "0") 
Debug "Byte 2:  "+RSet(Bin(Byte2&$FF), 8, "0") 
Debug "Byte 3:  "+RSet(Bin(Byte3&$FF), 8, "0") 
Debug "Word1  :  "+RSet(Bin(Wert1), 12, "0") 
Debug "Word2  :  "+RSet(Bin(Wert2), 12, "0") 
Helle