2

私の python コードは、zlib ライブラリを使用して uuencode されたファイルを解凍しようとしています。コード スニペットは次のとおりです。

self.decompress = zlib.decompressobj(wbits)
.
.
buf = self.fileobj.read(size)
.
.
uncompress = self.decompress.decompress(buf)

wbits の現在の値は「-zlib.MAX_WBITS」です。これはエラーをスローします:

Error -3 while decompressing: invalid literal/lengths set

Python zlib ライブラリがサポートしていることを認識しています。

RFC 1950 (zlib compressed format)
RFC 1951 (deflate compressed format)
RFC 1952 (gzip compressed format)

wbits の選択は次のとおりです。

to (de-)compress deflate format, use wbits = -zlib.MAX_WBITS
to (de-)compress zlib format, use wbits = zlib.MAX_WBITS
to (de-)compress gzip format, use wbits = zlib.MAX_WBITS | 16

だから私の質問は:

Where does a uuencoded file fall in this list?
Is it supported by zlib?
If yes, what should be the value for wbits?
If no, how do I proceed with this?

前もって感謝します!

4

1 に答える 1

1

zlib で圧縮して uuencode でエンコードし、手順を逆にする方法の簡単なデモを次に示します。

#!/usr/bin/env python

import zlib

data = '''This is a short piece of test data
intended to test uuencoding and decoding
using the uu module, and compression and 
decompression using zlib.
'''

data = data * 5

# encode
enc = zlib.compress(data, 9).encode('uu')
print enc

# decode
dec = zlib.decompress(enc.decode('uu'))

#print `dec` 
print dec == data

出力

begin 666 <data>
M>-KMCLL-A# ,1.^I8@I 5$,#(?822V C[%RV>CXY; %[19K+/,U(;ZKBN)+A
MU8[ +EP8]D&P!RA'3J+!2DP(Z[0UUF(DNB K@;B7U/Q&4?E:8#-J*P_/HMBV
;'^PNID]/]^6'^N^[RCRFZ?5Y??[P.0$_I03L

end

True

上記のコードは Python 2 でのみ動作します。Python 3 では、テキストとバイトが明確に分離されており、バイト文字列のエンコードやテキスト文字列のデコードはサポートされていません。したがって、上記の単純な uuencoding / uudecoding 手法は使用できません。

これは、Python2 と Python 3 の両方で動作する新しいバージョンです。

from __future__ import print_function
import zlib
import uu
from io import BytesIO

def zlib_uuencode(databytes, name='<data>'):
    ''' Compress databytes with zlib & uuencode the result '''
    inbuff = BytesIO(zlib.compress(databytes, 9))
    outbuff = BytesIO()
    uu.encode(inbuff, outbuff, name=name)
    return outbuff.getvalue()

def zlib_uudecode(databytes):
    ''' uudecode databytes and decompress the result with zlib '''
    inbuff = BytesIO(databytes)
    outbuff = BytesIO()
    uu.decode(inbuff, outbuff)
    return zlib.decompress(outbuff.getvalue())

# Test

# Some plain text data
data = '''This is a short piece of test data
intended to test uuencoding and decoding
using the uu module, and compression and 
decompression using zlib.
'''

# Replicate the data so the compressor has something to compress
data = data * 5
#print(data)
print('Original length:', len(data))

# Convert the text to bytes & compress it.
databytes = data.encode()
enc = zlib_uuencode(databytes)
enc_text = enc.decode()
print(enc_text)
print('Encoded length:', len(enc_text))

# Decompress & verify that it's correct
dec = zlib_uudecode(enc)
print(dec == databytes)   

出力

Original length: 720
begin 666 <data>
M>-KMCLL-A# ,1.^I8@I 5$,#(?822V C[%RV>CXY; %[19K+/,U(;ZKBN)+A
MU8[ +EP8]D&P!RA'3J+!2DP(Z[0UUF(DNB K@;B7U/Q&4?E:8#-J*P_/HMBV
;'^PNID]/]^6'^N^[RCRFZ?5Y??[P.0$_I03L

end

Encoded length: 185
True

zlib_uuencode文字列でzlib_uuencode作業することに注意してください。引数をbytes渡す必要があり、結果が返されます。bytesbytes

于 2014-12-11T09:20:38.260 に答える