#!/usr/bin/env python import sys import zlib import zipfile import os import os.path import getopt from struct import unpack _FILENAME_LEN_OFFSET = 26 _EXTRA_LEN_OFFSET = 28 _FILENAME_OFFSET = 30 _MAX_SIZE = 64 * 1024 class fixZip: def __init__(self, zinput, zoutput): self.inzip = zipfile.ZipFile(zinput,'r') self.outzip = zipfile.ZipFile(zoutput,'w') # open the input zip for reading only as a raw file self.bzf = file(zinput,'rb') def getlocalname(self, zi): local_header_offset = zi.header_offset self.bzf.seek(local_header_offset + _FILENAME_LEN_OFFSET) leninfo = self.bzf.read(2) local_name_length, = unpack(' 0: if len(cmpdata) > _MAX_SIZE : newdata = cmpdata[0:_MAX_SIZE] cmpdata = cmpdata[_MAX_SIZE:] else: newdata = cmpdata cmpdata = '' newdata = dc.decompress(newdata) unprocessed = dc.unconsumed_tail if len(unprocessed) == 0: newdata += dc.flush() data += newdata cmpdata += unprocessed unprocessed = '' return data def getfiledata(self, zi): # get file name length and exta data length to find start of file data local_header_offset = zi.header_offset self.bzf.seek(local_header_offset + _FILENAME_LEN_OFFSET) leninfo = self.bzf.read(2) local_name_length, = unpack('