Page 1 of 1

PackMemory x64 differs on x86

Posted: Sun Nov 01, 2009 8:09 pm
by Thunder93
Hi folks,

Can someone tell me if I'm doing something wrong...?, is it normal to be seeing PackMemory results with PureBasic x86 being different from PackMemory results with PureBasic x64 .. on the same unaltered file?

Code: Select all

newSize.l = PackMemory(mem1, mem2, Size,9)
x64 newSize = 88
x86 newSize = 70


Regards,
Thunder93

Re: PackMemory x64 differs on x86

Posted: Sun Nov 01, 2009 8:16 pm
by ts-soft
x64 use briefLZ and x86 use jCalg1

greetings
Thomas

/edit
you can use this for both:

Code: Select all

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

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux
    ImportC #PB_Compiler_Home + "purelibraries/linux/libraries/zlib.a"
  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

Re: PackMemory x64 differs on x86

Posted: Sun Nov 01, 2009 8:21 pm
by Thunder93
Thanks Thomas,

I remember being told this before, ... I like jCalg1 better, does better compression than the other one.

Re: PackMemory x64 differs on x86

Posted: Sun Nov 01, 2009 8:25 pm
by ts-soft
Thunder93 wrote:I like jCalg1 better, does better compression than the other one.
but can't pack all files like png, iso and so on, to many errors. I use mostly zip or for fast compress briefLZ

Re: PackMemory x64 differs on x86

Posted: Sun Nov 01, 2009 9:30 pm
by DoubleDutch
ts-soft: Thanks, nice routines that will be very handy. :)

Re: PackMemory x64 differs on x86

Posted: Sun Nov 01, 2009 10:20 pm
by Thunder93
Thanks ts-soft for sharing!

For the current project I'm looking to use jCalg1, for a few different reasons. But your code will surely be useful enough in the future!



Regards,
Thunder93

Re: PackMemory x64 differs on x86

Posted: Sun Nov 01, 2009 11:15 pm
by jamirokwai
ts-soft wrote:x64 use briefLZ and x86 use jCalg1

greetings
Thomas

/edit
you can use this for both:

Code: Select all

; 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
Hi there,

I added 2 lines for MacOS X-Support. Works great on PB 4.40b5 and PB 4.31 Intel :)
I will use these routines for my projects... I think on Mac OS, the file "/usr/lib/libz.dylib" is installed on default. But I don't know if it is save to rely on the existance. Maybe it's better to put a copy into the app-bundle also?!