Snippets

Alexander Hanel Script for decompressing & compressing data using aPlib libraries

Created by Alexander Hanel last modified
"""
    Author: Alexander Hanel
    Date: 2016/10/04
    Notes: Python Script for compressing and decompressing data using aPLib. Requires
    dll or shared libary depending on your os. Libraries can be downloaded from Ibsen
    software - http://www.ibsensoftware.com/products_aPLib.html
    
"""
import os
from ctypes import *

__all__ = [ 'pack', 'pack_safe', 'depack', 'depack_safe', 'aP_depack_asm_fast', 'CB_COMPRESS']


if os.name == 'nt':
    CB_COMPRESS = WINFUNCTYPE(c_uint, c_uint, c_uint, c_uint, c_void_p)
    try:
        _aplib = windll.aplib
    except Exception as error:
        print error 
else:
    CB_COMPRESS = CFUNCTYPE(c_uint, c_uint, c_uint, c_uint, c_void_p)
    try:
        _aplib = CDLL("libaplib.so")    
    except Exception as error:
        print error 

def decompress(data):
    if len(data) == 0:
        return None 
    if "AP32" in data[:4]:
        dstlen = _aplib.aPsafe_get_orig_size(data)
        dst = create_string_buffer(dstlen)
        dstlen = _aplib.aPsafe_depack(data, srclen, dst, dstlen)
        if dstlen == -1:
            return None 
        return buffer(dst, 0, dstlen)
    else:
        srclen = len(data)
        dstlen = 50 * srclen   
        dst = create_string_buffer(dstlen)
        try:
            dstlen = _aplib.aP_depack_asm_fast(data, dst)
        except:
            return None 
        if dstlen == -1:
            return None 
        return buffer(dst, 0, dstlen)

def compress(data, header=True):
    HEADER_SIZE = 24
    srclen = len(data)
    if srclen == 0:
        return None 
    dstlen = _aplib.aP_max_packed_size(srclen)
    dst = create_string_buffer(dstlen)
    wrkmem = create_string_buffer(_aplib.aP_workmem_size(srclen))
    try:
        dstlen = _aplib.aPsafe_pack(data, dst, srclen, wrkmem, None, 0)
    except:
        return None
    if dstlen == -1:
        return None 
    compressed = buffer(dst, 0, dstlen)
    if header:
        return compressed
    else:
        return compressed[HEADER_SIZE:]


Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.