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:

Code: Alles auswählen

*speicher2 = AllocateMemory(dest.l)+20000
durch diese ersetzen:

Code: Alles auswählen

*speicher2 = AllocateMemory(dest.l+20000)
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

Code: Alles auswählen

FileSeek(laenge.l-4)
  dest.l=ReadLong()

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