使用python和dlib进行压缩

时间:2013-07-31 23:56:57

标签: python zlib compression

我正在尝试解压缩文件进行一些更改而不是再次压缩它。解压缩似乎工作正常。我只需要一种方法来压缩它,以便像以前一样压缩它。

这是我的代码:

import zlib

path = './input'
pathOut = './output'

def getInt(intArray):
    summe = 0
    for i in range(len(list(intArray))):
        summe += intArray[i]*256**i
        return(summe)


print(path)
inputfile = open(path, 'rb')
header = {}

header.update({"intro":inputfile.read(28)})
print("intro",(header["intro"]))

for key in ["header_size", "c_size", "header_v", "u_size", "blocks"]:
    header.update({key:inputfile.read(4)})
    print(key,getInt(header[key]))


inputfile.seek(getInt(header['header_size']))

blocks_count = getInt(header['blocks'])
data = []
for i in range(blocks_count):
    block_header = {}
    block_header.update({"c_size":inputfile.read(2)})
    print("c_size",getInt(block_header["c_size"]))
    block_header.update({"u_size":inputfile.read(2)})
    print("u_size",getInt(block_header["u_size"]))
    block_header.update({"checksum":inputfile.read(4)})
    print("checksum",getInt(block_header["checksum"]))
    temp = inputfile.read(getInt(block_header['c_size']))[2:-4]
    data.append(zlib.decompressobj().decompress(b'x\x9c' + temp))
output = b''
inputfile.seek(0)
output = inputfile.read(getInt(header["header_size"]))
inputfile.close()

compressor = zlib.compressobj(1)

for block in data:
    compressor.compress(block)
    output += compressor.flush(zlib.Z_SYNC_FLUSH)

print("output length",len(output))
print("c_size",getInt(header["c_size"]))
outputFile = open(pathOut, 'wb')
outputFile.write(output)
outputFile.close()

当我尝试解压缩输出时,它说:

Traceback (most recent call last):
    File "C:\Users\LSDesktop\Desktop\bla - Copy.py", line 45, in <module>
        data.append(zlib.decompressobj().decompress(b'x\x9c' + temp))
zlib.error: Error -3 while decompressing data: invalid stored block lengths

这里是前50个字节,包括第一个块的标题。它们应该如何(压缩之前它们是如何):

b'B\x0c\x00 rWfyx\x01\xacY\tX\x14G\x16\xae\x9e)p\x00\r\x18\x15\xb9Lk\xc7\x03\xaf\x88\x1a\x8c\x0c\xa8\x084(\x82\x17\x87\x17\x88\xa3\x8c\x1c;r\x0b'

和前50个字节,包括压缩后的第一个块的标题:

b'\xacY\tX\x14G\x16\xae\x9e)p\x00\r\x18\x15\xb9Lk\xc7\x03\xaf\x88\x1a\x8c\x0c\xa8\x084(\x82\x17\x87\x17\x88\xa3\x8c\x1c;r\x0b\x82&\nk4\x1c\x89fQ\x89'

1 个答案:

答案 0 :(得分:0)

尝试使用Z_FINISH代替Z_SYNC_FLUSH。您正在解压缩单独的zlib流,但是您尝试创建一个永远不会终止的新单个zlib流。要创建单独的zlib流,每次都需要使用Z_FINISH。您必须至少在结尾使用Z_FINISH一次,否则您将永远不会生成正确的zlib流。

至于那个包装器,如果你试图写出你读过的相同格式,你就不会这样做。您需要重新创建标题信息,即长度和校验和。这种格式在哪里记录?您是否复制了代码以从其他地方读取输入?

这不是问题,但您不应该使用[2:-4]剥离zlib标头和预告片,然后使用b'x\x9c' +添加标头。为了减压。只需直接解压缩zlib流。