python zlib库是不是支持uuencode?
Posted
技术标签:
【中文标题】python zlib库是不是支持uuencode?【英文标题】:Does python zlib library support uuencode?python zlib库是否支持uuencode? 【发布时间】:2015-02-09 14:01:36 【问题描述】:我的 python 代码正在尝试使用 zlib 库解压缩 uuencoded 文件。这是代码sn-p:
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?
提前致谢!
【问题讨论】:
你试过直接解码吗? FWIW,uuencoding 不会压缩数据,它会扩展它。 UUencoding 将 3 个字节的任意二进制数据从一组 64 个安全可打印字符中转换为 4 个字节。见en.wikipedia.org/wiki/Uuencoding。 我假设您说的是使用 zlib 兼容的压缩方法压缩然后 uuencoded 的文件。如果是这样,使用str
.decode('uu')
方法或uu
模块解码,然后使用zlib解压。
【参考方案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
字符串:您必须将bytes
arg 传递给它们,它们会返回bytes
结果。
【讨论】:
不幸的是,这不适用于 python3(在为打印添加括号后也不起作用):TypeError: a bytes-like object is required, not 'str' @user44400 不,恐怕只有 Python 2。 Python 3 需要一种稍微不同的方法,因为 Python 3 对文本和字节进行了明确的区分。我很快就会添加一个 Python 3 版本。以上是关于python zlib库是不是支持uuencode?的主要内容,如果未能解决你的问题,请参考以下文章