ZLib

Anfängerfragen zum Programmieren mit PureBasic.
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

ZLib

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag von Amon »

*batsch* guter tipp - werd ich gleich mal am abend testen :)
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag 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.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag 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?
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag 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 :)
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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)
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag 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 @
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag 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
Antworten