Jump to content

Recommended Posts

Posted

Thank you very much, Ward!

I had solved my problem adding the size of the original data to the compressed binary (in my calling code, I didn't change the udf).

But your compression library, and also the others about hashing and encription are something I add to my list of resources. Congratulations for your amazing work!

By the way, this "Dll in Memory" udf only works in Autoit3.6, right?

I tried it in v3.3 but nothing happens (I just fixed compilation errors, like changing OnAutoItExitRegister to the Option() mechanism in 3.3, but DLL functions are not called correctly).

  On 6/8/2011 at 6:53 AM, 'Ward said:

Try my zlib UDF, uncompressed size is not needed.

  • 2 months later...
Posted

Hi!

I understand that I can use the UDF from Ward, but how do I use this library without the size of the uncompressed data?

Or tell me another library (I'm interested in solutions DLL)

Thanks.

  • 8 years later...
Posted (edited)

@ProgAndy made an modification for this UDF here:

 

Here is mine modification "zlib_udf.au3":

#AutoIt3Wrapper_UseX64=n
;~ https://www.autoitscript.com/forum/topic/87284-zlib-udf

Global Const $Z_OK = 0
Global Const $Z_STREAM_END = 1
Global Const $Z_NEED_DICT = 2
Global Const $Z_ERRNO = (-1)
Global Const $Z_STREAM_ERROR = (-2)
Global Const $Z_DATA_ERROR = (-3)
Global Const $Z_MEM_ERROR = (-4)
Global Const $Z_BUF_ERROR = (-5)
Global Const $Z_VERSION_ERROR = (-6)

Global Const $Z_NO_COMPRESSION = 0
Global Const $Z_BEST_SPEED = 1
Global Const $Z_BEST_COMPRESSION = 9
Global Const $Z_DEFAULT_COMPRESSION = (-1)

Global $Zlib_Dll = 0

; #FUNCTION# ====================================================================================================================
; Name ..........: _Zlib_Version
; Description ...: Returns the Zlib version as a string, i.e 3.1.12
; Syntax ........: _Zlib_Version()
; Parameters ....: None
; Return values .: version as a string
; Author ........: monoceres
; Modified ......: mLipok
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Zlib_Version()
    Local $call = DllCall($Zlib_Dll, "str:cdecl", "zlibVersion")
    If @error Then Return SetError(@error, @extended, $call)
    Return $call[0]
EndFunc   ;==>_Zlib_Version

; #FUNCTION# ====================================================================================================================
; Name ..........: _Zlib_Shutdown
; Description ...: Closes the zlib dll
; Syntax ........: _Zlib_Shutdown()
; Parameters ....: None
; Return values .: None
; Author ........: monoceres
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Zlib_Shutdown()
    DllClose($Zlib_Dll)
EndFunc   ;==>_Zlib_Shutdown

; #FUNCTION# ====================================================================================================================
; Name ..........: _Zlib_Startup
; Description ...: Opens the zlib dll, default name is zlibwapi.dll
; Syntax ........: _Zlib_Startup([$Filename = "zlib1.dll"])
; Parameters ....: $Filename            - [optional] an unknown value. Default is "zlib1.dll".
; Return values .: None
; Author ........: monoceres
; Modified ......: mLipok
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Zlib_Startup($Filename = "zlib1.dll")
    If @AutoItX64 Then Return SetError(1)
    $Zlib_Dll = DllOpen($Filename)
EndFunc   ;==>_Zlib_Startup

; #FUNCTION# ====================================================================================================================
; Name ..........: _Zlib_CalculateAdler32
; Description ...: An implementation of the Adler32 checksum included in the zlib lib
; Syntax ........: _Zlib_CalculateAdler32($DataPtr, $iDataSize)
; Parameters ....: $DataPtr             - an unknown value.
;                  $iDataSize           - an integer value.
; Return values .: checksum
; Author ........: monoceres
; Modified ......: mLipok
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Zlib_CalculateAdler32($DataPtr, $iDataSize)
    Local Const $ADLER32_BASE = 65521
    Local $call = DllCall($Zlib_Dll, "ulong:cdecl", "adler32", "ulong", $ADLER32_BASE, "ptr", $DataPtr, "int", $DataSize)
    If @error Then Return SetError(@error, @extended, $call)
    Return $call[0]
EndFunc   ;==>_Zlib_CalculateAdler32

; #FUNCTION# ====================================================================================================================
; Name ..........: _Zlib_Compress
; Description ...: Compresses data, the output buffer have to be at least InputBuffer + 0.1 % + 12 byte
; Syntax ........: _Zlib_Compress($InBufferPtr, $InBufferSize, $OutBufferPtr, Byref $OutBufferSize[, $CompressionLevel = $Z_DEFAULT_COMPRESSION])
; Parameters ....: $InBufferPtr         - an unknown value.
;                  $InBufferSize        - an unknown value.
;                  $OutBufferPtr        - an unknown value.
;                  $OutBufferSize       - [in/out] an unknown value.
;                  $CompressionLevel    - [optional] an unknown value. Default is $Z_DEFAULT_COMPRESSION.
; Return values .: compressed data
; Author ........: monoceres
; Modified ......: mLipok
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Zlib_Compress($InBufferPtr, $InBufferSize, $OutBufferPtr, ByRef $OutBufferSize, $CompressionLevel = $Z_DEFAULT_COMPRESSION)
    Local $call = DllCall($Zlib_Dll, "int:cdecl", "compress2", "ptr", $OutBufferPtr, "long*", $OutBufferSize, "ptr", $InBufferPtr, "long", $InBufferSize, "int", $CompressionLevel)
    If @error Then Return SetError(@error, @extended, $call)

    $OutBufferSize = $call[2]
    Return $call[0]
EndFunc   ;==>_Zlib_Compress

; #FUNCTION# ====================================================================================================================
; Name ..........: _Zlib_CompressBinary
; Description ...: Compresses binary data
; Syntax ........: _Zlib_CompressBinary($dBinary[, $CompressionLevel = $Z_DEFAULT_COMPRESSION])
; Parameters ....: $dBinary             - a binary variant value.
;                  $CompressionLevel    - [optional] an unknown value. Default is $Z_DEFAULT_COMPRESSION.
; Return values .: compressed binary data
; Author ........: monoceres
; Modified ......: mLipok
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Zlib_CompressBinary($dBinary, $CompressionLevel = $Z_DEFAULT_COMPRESSION)
    Local $InByteArr = DllStructCreate("byte[" & BinaryLen($dBinary) + 1 & "]")
    DllStructSetData($InByteArr, 1, $dBinary)

    Local $OutByteArr = DllStructCreate("byte[" & Round(BinaryLen($dBinary) * 1.0001) + 12 & "]")
    Local $OutByteArrSize = DllStructGetSize($OutByteArr)

    Local $ret = _Zlib_Compress(DllStructGetPtr($InByteArr), DllStructGetSize($InByteArr), DllStructGetPtr($OutByteArr), $OutByteArrSize, $CompressionLevel)

    If $ret <> 0 Then Return $ret

    Local $CompressedBuffer = DllStructCreate("byte[" & $OutByteArrSize & "]", DllStructGetPtr($OutByteArr))

    Local $RetBinary = DllStructGetData($CompressedBuffer, 1)
    Return $RetBinary
EndFunc   ;==>_Zlib_CompressBinary

; #FUNCTION# ====================================================================================================================
; Name ..........: _ZLib_UncompressBinary
; Description ...: Decompresses binary data
; Syntax ........: _ZLib_UncompressBinary($dBinary)
; Parameters ....: $dBinary             - a binary variant value.
; Return values .: decompressed data
; Author ........: monoceres
; Modified ......: ProgAndy, mLipok
; Remarks .......: you do not need to know the binary length of the decompressed data
; Related .......:
; Link ..........:
; Link ..........: https://www.autoitscript.com/forum/topic/131184-solved-flatedecode-zlib-pdf/?do=findComment&comment=913425
; Example .......: No
; ===============================================================================================================================
Func _ZLib_UncompressBinary($dBinary)
    Local $tBin = DllStructCreate("byte[" & BinaryLen($dBinary) & "]")
    DllStructSetData($tBin, 1, $dBinary)
    Local $iLength = DllStructGetSize($tBin) * 2
    $dBinary = 0

    Local $i = 1, $tBuf, $iSize, $iRes
    Do
        $tBuf = DllStructCreate("byte[" & $iLength * $i & "]")
        $iSize = DllStructGetSize($tBin)
        $iRes = _Zlib_Uncompress(DllStructGetPtr($tBin), $iSize, DllStructGetPtr($tBuf), DllStructGetSize($tBuf))
        $i += 1
    Until $iRes <> -5
    If $iRes <> 0 Then Return SetError($iRes, 0, "")
    $tBin = 0
    Return DllStructGetData(DllStructCreate("byte[" & $iSize & "]", DllStructGetPtr($tBuf)), 1)
EndFunc   ;==>_ZLib_UncompressBinary

; #FUNCTION# ====================================================================================================================
; Name ..........: _Zlib_Uncompress
; Description ...: Decompresses data
; Syntax ........: _Zlib_Uncompress($CompressedPtr, Byref $CompressedSize, $UncompressedPtr, $UncompressedSize)
; Parameters ....: $CompressedPtr       - an unknown value.
;                  $CompressedSize      - [in/out] an unknown value.
;                  $UncompressedPtr     - an unknown value.
;                  $UncompressedSize    - an unknown value.
; Return values .: decompressed data
; Author ........: monoceres
; Modified ......: ProgAndy, mLipok
; Remarks .......: you need to know how large the decompressed data will be
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Zlib_Uncompress($CompressedPtr, ByRef $CompressedSize, $UncompressedPtr, $UncompressedSize)
    Local $call = DllCall($Zlib_Dll, "int:cdecl", "uncompress", "ptr", $UncompressedPtr, "long*", $UncompressedSize, "ptr", $CompressedPtr, "long", $CompressedSize)
    If @error Then Return SetError(1, 0, -7)
    $CompressedSize = $call[2]
    Return $call[0]
EndFunc   ;==>_Zlib_Uncompress

 

and example "zlib_udf_example.au3":
 

#AutoIt3Wrapper_UseX64=n
#include <MsgBoxConstants.au3>
#include "zlib_udf.au3"

_Example()

Func _Example()
    _Zlib_Startup("zlib1.dll")
    If @error Then ConsoleWrite('! ---> @error=' & @error & '  @extended=' & @extended & ' : _Zlib_Startup' & @CRLF)

    ConsoleWrite("! _Zlib_Version = " & _Zlib_Version() & @CRLF)
    Local $bin = StringToBinary("hahahahahahahahahahahehe")
;~  Local $binlen = BinaryLen($bin)

    Local $compressed = _Zlib_CompressBinary($bin)
    Local $uncompressed = _ZLib_UncompressBinary($compressed)

    MsgBox($MB_ICONINFORMATION, BinaryToString($bin), _
            "Original:" & @CRLF & _
            $bin & @CRLF & _
            @CRLF & _
            "Compressed: " & @CRLF & _
            $compressed & @CRLF & _
            @CRLF & _
            "Uncompressed: " & @CRLF & _
            $uncompressed & @CRLF & _
            "")
    _Zlib_Shutdown()
EndFunc   ;==>_Example

 

EDIT:
There is still small bug with $uncompressed value ... WIP

 

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...