2016-11-17 2 views
1

MS-ZIP 압축 CAB 파일을 쓰거나 읽는 코드를 작성하려고합니다. MS-ZIP은 zlib에서 구현 된 것과 동일한 수축 알고리즘을 사용합니다. 나는 zlib만을 포함하는이 간단한 스크립트로 문제를 단순화했다.zlib : 데이터 압축 해제 중 오류 -3 : 거리가 너무 멀습니다.

  • 다른 CAB 압축 풀기 도구로 파일을 읽을 수 있으므로 압축 기능이 올바르다는 것을 알고 있습니다.

  • 압축 해제 기능이 작동하지 않습니다. 두 개 이상의 청크를 압축 해제해야 할 때 실패합니다.

압축 코드와 일치하는 압축 해제 코드를 가져올 수 없습니다. 나는이 스크립트를 실행하면

import sys, struct, zlib 

MAX_CHUNK_SIZE = 100 

def main(): 
    uncomp = (b'[email protected][email protected][email protected]@<GJHE=EGE<[email protected]?<IABT>EK' 
       b'<[email protected]?DGDS>[email protected]' 
       b'[email protected]=IGG<?JQBGBPLOPONU?IBBSNBK<[email protected]>H=CQ?BS><@UE' 
       b'[email protected]>?JOSEQRCTP>S<?N>[email protected]??ARJ>QUJSHLQN<P<>D==') 

    print("python", sys.version) 
    print("zlib version", zlib.ZLIB_VERSION) 
    print("zlib runtime version", zlib.ZLIB_RUNTIME_VERSION) 

    chunks = compress(uncomp) 
    decomp = decompress(chunks) 
    assert(uncomp == decomp) 


def compress(data): 
    start_off = 0 
    data_size = len(data) 
    remaining = data_size 
    res = [] 
    zdict = b'' 

    while start_off < data_size: 
     print("compress chunk %d"%len(res)) 

     chunk_size = min(MAX_CHUNK_SIZE, remaining) 
     chunk = data[start_off:start_off+chunk_size] 
     c = b'' 

     z = zlib.compressobj(wbits=-15, zdict=zdict) 
     c += z.compress(chunk) 
     c += z.flush(zlib.Z_FINISH) 

     res.append(c) 

     zdict = chunk 
     start_off += chunk_size 
     remaining -= chunk_size 

    return res 

def decompress(chunks): 
    zdict = b'' 
    res = [] 

    for i, c in enumerate(chunks): 
     print("decompress chunk %d"%i) 
     out = b'' 

     z = zlib.decompressobj(wbits=-15, zdict=zdict) 
     out += z.decompress(c) 
     out += z.flush() 
     zdict = out 

     res.append(out) 

    return b''.join(res) 


if __name__ == '__main__': 
    main() 

내가 얻을 : 그것은 또한 파이썬을 실행 ideone.com http://ideone.com/baD3gg에 실패

python 3.4.5 (default, Jul 03 2016, 13:55:08) [GCC] 
zlib version 1.2.8 
zlib runtime version 1.2.8 
compress chunk 0 
compress chunk 1 
decompress chunk 0 
decompress chunk 1 
Traceback (most recent call last): 
    File "bug.py", line 65, in <module> 
    main() 
    File "bug.py", line 16, in main 
    decomp = decompress(chunks) 
    File "bug.py", line 55, in decompress 
    out += z.decompress(c) 
zlib.error: Error -3 while decompressing data: invalid distance too far back 

3.4.3+ ZLIB 1.2.8

+0

이 그것을 실행하고있어'12/12 OK' 결과. –

+1

(와우, 안녕하세요!) 나는 일관되게 이러한 오류를 얻습니다 (테스트 5,6,7,8,9,10,11 언젠가 2, 3). zlib 1.2.8 실행. 데이터를 덤프하고 C 프로그램으로 압축을 풀려고했는데 파이썬 스크립트 (1.2.8과의 연결)와 같은 결과가 더 많은 코드로 내 게시물을 편집합니다. – knarf

+0

게시물을 편집했습니다. – knarf

답변

1

내가했다 보인다 CPython 문제 # 27164로 실행. 이 글을 쓰면서 (2016-11-21), 분기 마스터와 3.5에서만 수정이 가능합니다. 난 그냥 복사 코드를 붙여

https://bugs.python.org/issue27164

+0

사실 파이썬 버전은 3.5.2입니다. 파이썬 3.5.2 (v3.5.2 : 4def2a2901a5, 6 월 26 일 2016, 10:47:25) [GCC 4.2.1 (Apple Inc. build 5666) (점 3)] zlib 버전 1.2.3 zlib 런타임 버전 1.2.8 청크 압축 0 청크 압축 1 청크 압축 해제 0 청크 압축 해제 1' –

관련 문제