2013-05-04 1 views
1

예기치 않은 결과를 나타내는 zlib의 예가 있습니다.Python의 zlib에서 예기치 않은 동작이 무엇입니까?

나는 간단한 문자열 압축으로 시작하는 경우 : 나는 내가 예상 정확히 무엇을 얻을 반대 할 경우 지금

>>> import zlib 
>>> import binascii 
>>> compressed = binascii.hexlify(zlib.compress('first_message')) 
>>> compressed 
'789c4bcb2c2a2e89cf4d2d2e4e4c4f05002651056d' 

을 그러나

>>> zlib.decompress(compressed.decode("hex")) 
'first_message' 

을 나는 예상치 못한 결과를 얻을이를 시도하는 경우 :

>>> d = zlib.decompressobj() 
>>> d.decompress(compressed.decode("hex")) 
'first_message' 
>>> d = zlib.decompressobj() 
>>> d.decompress(compressed[:-2].decode("hex")) 
'first_message' 

무엇이 여기에 있습니까? 왜이 둘은 같은 결과를 반환합니까?

답변

2

입력에 따라 압축 해제 된 데이터의 양을 사용할 수 있기 때문입니다. zlib.decompressobj()을 사용하면 압축 된 데이터의 개체 청크를 공급할 수 있으며 가능한 한 많은 압축 해제 된 데이터를 반환합니다. 그러면 더 많이 먹을 수 있습니다.

최종 Adler-32 검사 (4 바이트) 및 마지막으로 수축 된 블록의 끝 코드 만 노크하고 있기 때문에 마지막 4 또는 5 바이트 만 잘라내면 압축 해제 된 모든 데이터를 얻을 수 있습니다. 일부 미사용 비트가 바이트 경계 (1 바이트 더)로 가져옵니다. 모든 데이터를 압축 해제하는 데 필요하지는 않지만 데이터의 끝을 표시하고 데이터의 무결성을 확인하는 데만 필요합니다.

+0

감압 객체를 엄격하게 만드는 방법이 있습니까? 즉, 마지막 바이트도 포함하게됩니까? – c00kiemonster

+0

개체에 마지막 바이트를 지정하지 않으면 개체에 어떻게 포함시킬 수 있습니까? –

+0

이 동작은'socket' 예제에서 발견되었습니다. 미리 압축 된 여러 개의 메시지를 미리 구분 된 구분 기호로 구분하여 보냈습니다. 그러나 실수로'compressed [: - 2] '를 받았고 압축이 풀 렸습니다. 다음에 배정 된 바이트와 분리 기호를 받았기 때문에 이것은 성가신 일입니다. 따라서 여러 개의 압축 된 메시지가 동기화되지 않았고 제대로 압축되지 않았습니다. – c00kiemonster