【发布时间】:2010-07-01 19:10:23
【问题描述】:
我编写了这段 Python 代码,试图将对象转换为一串 1 和 0,但解码失败,因为无法解压缩数据。这是代码:
def encode(obj):
'convert an object to ones and zeros'
def tobin(str):
rstr = ''
for f in str:
if f == "0": rstr += "0000"
elif f == "1": rstr += "0001"
elif f == "2": rstr += "0010"
elif f == "3": rstr += "0100"
elif f == "4": rstr += "1000"
elif f == "5": rstr += "1001"
elif f == "6": rstr += "1010"
elif f == "7": rstr += "1100"
elif f == "8": rstr += "1101"
elif f == "9": rstr += "1110"
else: rstr += f
return rstr
import pickle, StringIO
f = StringIO.StringIO()
pickle.dump(obj, f)
data = f.getvalue()
import base64
return tobin(base64.b16encode(base64.b16encode(data)))
def decode(data):
def unbin(data):
rstr = ''
for f in data:
if f == "0000": rstr += "0"
elif f == "0001": rstr += "1"
elif f == "0010": rstr += "2"
elif f == "0100": rstr += "3"
elif f == "1000": rstr += "4"
elif f == "1001": rstr += "5"
elif f == "1010": rstr += "6"
elif f == "1100": rstr += "7"
elif f == "1101": rstr += "8"
elif f == "1110": rstr += "9"
return rstr
import base64
ndata = base64.b16decode(base64.b16decode(unbin(data)))
import pickle, StringIO
f = StringIO.StringIO(ndata)
obj = pickle.load(f)
return obj
【问题讨论】:
-
你知道 Python 有一个内置的
bin()函数吗? -
他的二进制字符串转换有些混乱(例如 0100 3)
-
@Tim Pietzcker:
tobin没有进行二进制转换。 -
澄清一下:您在这里所做的不符合加密的条件——它实际上只是数据的编码。事实上,它看起来很像格雷码:en.wikipedia.org/wiki/Gray_code。它当然不能提供太多的安全性:它可能是非常简单的暴力破解。
-
我编辑了问题以更改术语(加密→编码,解密→解码),因为这是一个严重的错误,可能会严重混淆未来的提问者。请参阅 en.wikipedia.org/wiki/Code> 和 en.wikipedia.org/wiki/Encryption> 了解更多详情。
标签: python encoding pickle decoding