PB4.xx Speicher packen/entpacken im Zipformat

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

PB4.xx Speicher packen/entpacken im Zipformat

Beitrag von ts-soft »

Code: Alles auswählen

; Autor: Thomas (ts-soft) Schulz
; PB-Version: 4.xx
; OS: windows/linux/MacOS

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux
    ImportC #PB_Compiler_Home + "purelibraries/linux/libraries/zlib.a"
CompilerCase #PB_OS_MacOS
  ImportC "/usr/lib/libz.dylib"
  CompilerCase #PB_OS_Windows
    ImportC "zlib.lib"
CompilerEndSelect
  compress2(*dest, *destLen, *source, sourceLen, level)
  uncompress(*dest, *destLen, *source, sourceLen)
EndImport

Procedure zipPackMemory(*source, sourceLen = #PB_Default, level = #PB_Default)
  Protected *dest, destLen
  
  If level < #PB_Default Or level > 9 : level = #PB_Default : EndIf
  If *source
    If sourceLen = #PB_Default : sourceLen = MemorySize(*source) : EndIf
    destLen = sourceLen + 13 + (Int(sourceLen / 100))
    *dest = AllocateMemory(destLen)
    If *dest
      If Not compress2(*dest, @destLen, *source, sourceLen, level)
        *dest = ReAllocateMemory(*dest, destLen)
        ProcedureReturn *dest
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure zipUnpackMemory(*source, *dest)
  Protected sourceLen = MemorySize(*source)
  Protected destLen = MemorySize(*dest)

  If Not uncompress(*dest, @destLen, *source, sourceLen)
    ProcedureReturn destLen
  EndIf
EndProcedure

; Beispiel:
Define test.s = "Feel the ..Pure.. Power"
Define *Mem = zipPackMemory(@test, StringByteLength(test))

If *Mem
  Define *destMem = AllocateMemory(StringByteLength(test))
  Debug PeekS(*destMem, zipUnpackMemory(*Mem, *destMem))
EndIf
Kann ja vielleicht einer brauchen :wink:

// edit
Anpassung an MacOS
Zuletzt geändert von ts-soft am 12.06.2011 13:24, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB4.xx Speicher packen/entpacken im Zipformat

Beitrag von Kiffi »

Danke! :allright:

(allerdings solltest Du in Deinem Beispiel einen anderen (längeren)
Teststring nehmen, denn in diesem Fall ist der gepackte Output länger als
die Quelle ;-))


Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: PB4.xx Speicher packen/entpacken im Zipformat

Beitrag von ts-soft »

Kiffi hat geschrieben:(allerdings solltest Du in Deinem Beispiel einen anderen (längeren) Teststring nehmen, denn in diesem Fall ist der gepackte Output länger als die Quelle ;-))
Stimmt ja garnicht, im Unicode-Modus spart man 3 Byte :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB4.xx Speicher packen/entpacken im Zipformat

Beitrag von Kiffi »

nimm einfach

Code: Alles auswählen

Define test.s = Space(32000)
das ist beeindruckender. Mit oder ohne Unicode ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: PB4.xx Speicher packen/entpacken im Zipformat

Beitrag von ts-soft »

Kiffi hat geschrieben:nimm einfach

Code: Alles auswählen

Define test.s = Space(32000)
das ist beeindruckender. Mit oder ohne Unicode ;-)

Grüße ... Kiffi
Knapp 100 KB hat die zlib.lib, ist also auch noch nicht so beeindruckend :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten