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