Seite 1 von 1
ZLib
Verfasst: 12.10.2005 23:53
von Amon
Huhu Community,
ich glaub mir geht das Licht nicht auf - warum bekommt ich da ein "invalid memory access" beim aufruf der zlibfunktion?
Code: Alles auswählen
file.s = "C:\Dokumente und Einstellungen\Harry\Eigene Dateien\purebasic\test\archiv.gz"
pfad.s = "C:\Dokumente und Einstellungen\Harry\Eigene Dateien\purebasic\test\"
If ReadFile(0, file.s)
laenge.l = Lof()
*speicher = AllocateMemory(laenge.l)
If *speicher
source.l = ReadData(*speicher, laenge.l) ; Einlesen aller Daten in den Speicherblock
Debug "Anzahl der gelesenen Bytes: " + Str(source.l)
EndIf
CloseFile(0)
EndIf
If ReadFile(0, file.s)
FileSeek(laenge.l-4)
dest.l=ReadLong()
CloseFile(0)
Debug "Entpackte Datei: " + Str(dest.l)
EndIf
If dest.l > 0
*speicher2 = AllocateMemory(dest.l)+20000
erfolg=ZLIBUnCompress(*speicher2, dest.l, *speicher, source.l)
Debug "Erfolg: "+Str(erfolg)
EndIf
Pointer / Zeiger / Adressenproblem?
Danke im Voraus
Amon
Verfasst: 13.10.2005 00:37
von NicTheQuick
Vielleicht solltest du diese Zeile:
durch diese ersetzen:
Sonst weiß ich ja nicht, was die Lib da erwartet.
Verfasst: 13.10.2005 08:11
von Amon
*batsch* guter tipp - werd ich gleich mal am abend testen

Verfasst: 13.10.2005 11:46
von gnozal
ZLIBUnCompress()
Syntax
ZLIBUnCompress(*DestBuffer, DestBufferLen.l, *SourceBuffer, SourceBufferLen.l)
Description
Decompresses the source buffer into the destination buffer.
SourceBufferLen is the byte length of the source buffer.
Upon entry, DestBufferLen is the total size of the destination buffer, which must be large
enough to hold the entire uncompressed data. (The size of the uncompressed data must
have been saved previously by the compressor and transmitted to the decompressor by
some mechanism outside the scope of this compression library).
Upon exit, DestBufferLen is the actual size of the compressed buffer.
Verfasst: 13.10.2005 18:50
von Amon
also ich hab jetz nach tip von nic jetzt korrigiert - hilft nix
aber mit deinem tip gnozal kann ich leider nix anfangen,
Wenn ich das gz archiv mit winrar extrahiere, hat es exact die grösse die ich mit dem allocate memory alloziere - die 20000 mehr bytes sollten eigentlich nur zur sicherheit dortseinen - bzw. haben den weg dahin gefunden nachdem ich keinen erfolg hatte...
(The size of the uncompressed data must
have been saved previously by the compressor and transmitted to the decompressor by
some mechanism outside the scope of this compression library).
das macht ja
Oder seh ich jetzt den Wald vor lauter Bäumen nicht?
Verfasst: 13.10.2005 19:41
von HeX0R
Ich kenn die Lib ehrlich gesagt nicht, aber wenn ich das richtig verstehe, hast du nach dem Packen einfach nen Long mit der Länge hintendran gepappt ?
D.h. diese 4 Bytes gehören ja eigentlich nicht zum Archiv, vielleicht gehts deswegen nicht ?
Versuchs mal so:
Code: Alles auswählen
file.s = "C:\Dokumente und Einstellungen\Harry\Eigene Dateien\purebasic\test\archiv.gz"
pfad.s = "C:\Dokumente und Einstellungen\Harry\Eigene Dateien\purebasic\test\"
If ReadFile(0, file)
laenge.l = Lof() - 4
*speicher = AllocateMemory(laenge)
If *speicher
source.l = ReadData(*speicher, laenge) ; Einlesen aller Daten in den Speicherblock
Debug "Anzahl der gelesenen Bytes: " + Str(source)
dest.l = ReadLong()
EndIf
CloseFile(0)
EndIf
Debug "Entpackte Datei: " + Str(dest.l)
If dest.l <> 0
*speicher2 = AllocateMemory(dest)
If *speicher2
erfolg=ZLIBUnCompress(*speicher2, dest, *speicher, source)
Debug "Erfolg: "+Str(erfolg)
EndIf
EndIf
Verfasst: 13.10.2005 19:48
von Amon
stetes probieren hilft
Code: Alles auswählen
erfolg=ZLIBUnCompress(*speicher2, @dest.l, *speicher, @source.l)
ist die lösung des probs
hier jetzt nochma der ganz code
Code: Alles auswählen
file.s = "C:\Dokumente und Einstellungen\Harry\Eigene Dateien\purebasic\test\eremiteninsel.daz"
pfad.s = "C:\Dokumente und Einstellungen\Harry\Eigene Dateien\purebasic\test\"
If ReadFile(0, file.s)
laenge.l = Lof()
Debug laenge.l
*speicher = AllocateMemory(laenge.l)
If *speicher
source.l = ReadData(*speicher, laenge.l) ; Einlesen aller Daten in den Speicherblock
Debug "Anzahl der gelesenen Bytes: " + Str(source.l)
EndIf
CloseFile(0)
EndIf
If ReadFile(0, file.s)
FileSeek(laenge.l)
dest.l=ReadLong()
CloseFile(0)
Debug "Entpackte Datei: " + Str(dest.l)
EndIf
If dest.l > 0
*speicher2 = AllocateMemory(dest.l)
erfolg=ZLIBUnCompress(*speicher2, @dest.l, *speicher, @source.l)
Debug "Erfolg: "+Str(erfolg)
EndIf
Vielen Dank trotzdem für Eure Bemühungen

Verfasst: 13.10.2005 19:51
von HeX0R
Amon hat geschrieben:stetes probieren hilft
Code: Alles auswählen
erfolg=ZLIBUnCompress(*speicher2, @dest.l, *speicher, @source.l)
ist die lösung des probs
Hmm... dann wäre aber die oben genannte Beschreibung falsch:
ZLIBUnCompress()
Syntax
ZLIBUnCompress(*DestBuffer, DestBufferLen.l, *SourceBuffer, SourceBufferLen.l)
Verfasst: 13.10.2005 19:59
von Amon
ja, aber das
Upon exit, DestBufferLen is the actual size of the compressed buffer.
hat mich stutzig gemacht - d.h. ja, dass die function was zurückschreibt, dh. sie brauch die adresse der übergebenen variable - daher der @
Verfasst: 14.10.2005 23:27
von Amon
Nachdem jetzt ja das compress & uncompress tadellos funktionieren - wollt ich nun auch die gz routinen verstehen
es gibt zwar auf purearea.net eine userlib für die zlib, die auch diese funktionen zur verfügung stellt - nur scheint das wohl nur im testbesipiel zu funktionieren.
wenn ich zlib - gzread gzopen gzcloe mittels der library funktionen aufrufe - funktioniert es tadellos, sobald ich es in eine userlib stelle gehts nimmer.
weiss vielleicht zufällig wer worand das liegt, und wenn ja - gibts da trotzdem ne möglichkeit das in eine userlib zu bringen?
danke
Amon