2016-10-04 75 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給出不同的結果。用下面的代碼:

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) 

我得到這樣的輸出:

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' 

,然後程序上線18失敗,_lzma.LZMAError: Input format not supported by decoder


我這裏有3個問題:

  1. 怎麼來的輸出lzma.compress是如此比lzma.LZMACompressor.compress即使它看似做同樣的事情更長的時間?
  2. 在第二個示例中,解壓縮程序爲什麼會抱怨格式無效?
  3. 我怎樣才能得到正確解壓縮的第二個例子?

回答

0

關於第二個例子中,你正在下降的壓縮數據流的一部分,而僅bytes_out得到flush部分。在另一方面,工作原理:

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

注意,第一個例子是自源lzma.compress真的相當於是:

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