Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythonzlib库支持uuencode吗?_Python_Gzip_Email Attachments_Zlib_Uuencode - Fatal编程技术网

pythonzlib库支持uuencode吗?

pythonzlib库支持uuencode吗?,python,gzip,email-attachments,zlib,uuencode,Python,Gzip,Email Attachments,Zlib,Uuencode,我的python代码试图使用zlib库解压缩uuencoded文件。以下是代码片段: self.decompress = zlib.decompressobj(wbits) . . buf = self.fileobj.read(size) . . uncompress = self.decompress.decompress(buf) 我当前的wbits值是'-zlib.MAX_wbits'。这会引发一个错误: Error -3 while decompressing: invalid li

我的python代码试图使用zlib库解压缩uuencoded文件。以下是代码片段:

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)
WBIT的选择是:

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?

提前谢谢

下面是一个快速演示,演示如何使用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
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
begin666
M> -KMCLL-A#,1^I8@I5美元,#(?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$\U I03L
结束
真的

上面的代码只适用于Python 2。Python 3明确区分了文本和字节,并且不支持字节字符串的编码或文本字符串的解码。因此,它不能使用上面所示的简单uuencoding/UUEdecoding技术

这里有一个新版本,它可以在Python2和pytho3上工作

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)   
from\uuuuu future\uuuuu导入打印功能
进口zlib
输入uu
从io导入字节io
def zlib_uencode(数据字节,名称=“”):
''使用zlib压缩数据字节并对结果进行编码''
inbuff=BytesIO(zlib.compress(数据字节,9))
exputff=BytesIO()
uu.encode(inbuff,exputff,name=name)
返回exputff.getvalue()
def zlib_uudecode(数据字节):
''uudecode数据字节并用zlib解压缩结果''
inbuff=字节(数据字节)
exputff=BytesIO()
uu.解码(inbuff,exputff)
返回zlib.decompress(exputff.getvalue())
#试验
#一些纯文本数据
data=''这是一小段测试数据
用于测试UU编码和解码
使用uu模块,并进行压缩和
使用zlib进行解压缩。
'''
#复制数据,以便压缩器可以进行压缩
数据=数据*5
#打印(数据)
打印('原始长度:',长度(数据))
#将文本转换为字节并压缩。
databytes=data.encode()
enc=zlib_uencode(数据字节)
enc_text=enc.decode()
打印(附件文本)
打印('编码长度:',长度(附件文本))
#解压缩并验证它是否正确
dec=zlib_uDecode(enc)
打印(dec==数据字节)
输出

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
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
原始长度:720
开始666
M> -KMCLL-A#,1^I8@I5美元,#(?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$\U I03L
结束
编码长度:185
真的

请注意
zlib_uencode
zlib_uencode
处理
bytes
字符串:您必须向它们传递
bytes
arg,它们返回
bytes
结果。

您是否尝试过对其进行解码?FWIW,uucodenction不会压缩数据,它会扩展数据。uucodencodeing会将任意二进制数据转换为3个字节ta从一组64个安全的可打印字符中转换为4个字节。请参阅。我假设您谈论的是一个使用zlib兼容压缩方法压缩的文件,然后对其进行uu编码。如果是这样,请使用
str
.decode('uu')对其进行解码
方法或
uu
模块,然后使用zlib解压。不幸的是,这不适用于python3(在为打印添加括号后也不适用):TypeError:bytes-like对象是必需的,而不是'str'@user44400不,恐怕它只是Python 2。Python 3需要一种稍微不同的方法,因为Python 3明确区分文本和字节。我将很快添加Python 3版本。