2013-07-31 3 views
1

파일 압축을 풀려고하고 있는데 몇 가지 사항을 변경하고 다시 압축해야합니다. 감압은 잘 작동하는 것 같습니다. 압축하기위한 메소드가 필요합니다. 이전과 같은 방법으로 압축됩니다. python 및 zlib를 다시 압축하십시오.

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 바이트 : 내 출력을 압축 할 때

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() 

는 말한다 :

여기 내 코드입니다. 사람은 (I 압축하기 전에 그들이 얼마나)해야한다 방법 : 나는 그것을 압축

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' 

답변

0

대신의 Z_FINISH 시도 Z_SYNC_FLUSH. 별도의 zlib 스트림의 압축을 풀고 있지만 종료되지 않은 새로운 단일 zlib 스트림을 만들려고합니다. 별도의 zlib 스트림을 만들려면 매번 Z_FINISH을 사용해야합니다. 최소한 Z_FINISH을 끝에 한 번 사용해야합니다. 그렇지 않으면 올바른 zlib 스트림이 생성되지 않습니다.

그 주위의 래퍼에 관해서는, 당신이 읽고있는 같은 형식을 쓰려고 시도한다면, 그렇게하지 않을 것입니다. 헤더 정보, 즉 길이와 체크섬을 다시 만들어야합니다. 이 형식은 어디에 문서화되어 있습니까? 코드를 복사하여 다른 곳에서 입력을 읽었습니까?

이것은 문제가되지 않지만 zlib 헤더와 트레일러를 [2:-4]으로 제거한 다음 b'x\x9c' +과 함께 헤더를 다시 추가하면 안됩니다. 감압하기 위해서. zlib 스트림을 직접 압축 해제하면됩니다.

+0

이 질문에 대한 답변을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. –

+0

아무 질문도 묻지 않았다는 사실을 제쳐두고 설정하면 답을 제공합니다. "Z_SYNC_FLUSH 대신 Z_FINISH를 시도해보십시오." 비평하거나 질문하기? –

+0

글쎄, "Z_FINISH"로 "Z_SYNC_FLUSH"를 대체하면 "zlib.error : 데이터 압축 중 오류 -2 : 스트림 상태가 일관되지 않습니다."그리고 마지막 블록에 대해서만 수행하면 이전과 같은 오류가 발생합니다 . – user2640045