2016-10-04 13 views
0

lzma을 사용하여 메모리의 일부 데이터를 압축하고 압축을 풀려고합니다. 나는 다음과 같은 접근 방식이 작동하는지 알고LZMADecompressor가 올바르게 작동하지 않습니다.

import lzma 

s = 'Lorem ipsum dolor' 

bytes_in = s.encode('utf-8') 

print(s) 
print(bytes_in) 

# Compress 
bytes_out = lzma.compress(data=bytes_in, format=lzma.FORMAT_XZ) 
print(bytes_out) 

# Decompress 
bytes_decomp = lzma.decompress(data=bytes_out, format=lzma.FORMAT_XZ) 

print(bytes_decomp) 

출력은 다음과 같습니다

Lorem ipsum dolor 
b'Lorem ipsum dolor' 
b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3\x01\x00\x10Lorem ipsum dolor\x00\x00\x00\x00\xddq\x8e\x1d\x82\xc8\xef\xad\x00\x01)\x112\np\x0e\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ' 
b'Lorem ipsum dolor' 

는 그러나, 나는 lzma.LZMACompressor를 사용하여 서로 다른 결과를 얻을 수 있음을 알 수 있습니다. 다음 코드 :

Lorem ipsum dolor 
b'Lorem ipsum dolor' 
b'\x01\x00\x10Lorem ipsum dolor\x00\x00\x00\x00\xddq\x8e\x1d\x82\xc8\xef\xad\x00\x01)\x112\np\x0e\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ' 

을 그리고 프로그램은 _lzma.LZMAError: Input format not supported by decoder에 맞춰 18 일에 실패

import lzma 

s = 'Lorem ipsum dolor' 

bytes_in = s.encode('utf-8') 

print(s) 
print(bytes_in) 

# Compress  
lzc = lzma.LZMACompressor(format=lzma.FORMAT_XZ) 
lzc.compress(bytes_in) 
bytes_out = lzc.flush() 
print(bytes_out) 

# Decompress 
bytes_decomp = lzma.decompress(data=bytes_out, format=lzma.FORMAT_XZ) 

print(bytes_decomp) 

나는이 출력을 얻을.

  1. 방법 lzma.compress의 출력이 너무 이상 겉보기 같은 일을하더라도 lzma.LZMACompressor.compress보다 올 :

    여기 3 개 질문이?
  2. 두 번째 예에서 압축 해제 기가 잘못된 형식에 대해 불만을 제기하는 이유는 무엇입니까?
  3. 두 번째 예를 올바르게 압축 해제하려면 어떻게해야합니까?

답변

0

두 번째 예에서는 압축 된 스트림의 일부를 삭제하고 bytes_outflush 부분 만 가져옵니다. 반면에, 그 작동 : 첫 번째 예는 lzma.compress의 소스 이후 정말 같다고

lzc = lzma.LZMACompressor(format=lzma.FORMAT_XZ) 
bytes_out = lzc.compress(bytes_in) + lzc.flush() 
print(bytes_out) 

노트는 다음과 같습니다

def compress(data, format=FORMAT_XZ, check=-1, preset=None, filters=None): 
    """Compress a block of data. 

    Refer to LZMACompressor's docstring for a description of the 
    optional arguments *format*, *check*, *preset* and *filters*. 

    For incremental compression, use an LZMACompressor instead. 
    """ 
    comp = LZMACompressor(format, check, preset, filters) 
    return comp.compress(data) + comp.flush()