base64编码与python对象上的pickling

时间:2013-12-21 11:04:32

标签: python base64 pickle

我没有使用Python进行酸洗和编码。但是,正如我开始了解它们一样,我想我可以使用两种不同的方式执行将python对象转换为字符串的相同操作。

#1:使用pickle模块

>>> encoded = pickle.dumps(range(10))
>>> pickle.loads(encoded)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#2:使用Base64编码

# First I'l define encode and decode functions for convenience.

def encode(obj):
    string = json.dumps(obj)
    return base64.b64encode(string)

def decode(string):
    decoded_string = base64.b64decode(string)
    return json.loads(decoded_string)

# Encode and Decode.
>>> encoded = encode(range(10))
>>> decode(encoded)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

的base64

它们的典型用例是什么?哪种方法的性能更高效?

更新

我现在明白我的问题没有多大意义。比较jsonpickle将是一个更好的问题。 Base64编码可以在json或pickle字符串上执行,用于创建仅ASCII字符串编码;示例:用于在URL中将数据作为GET参数传递。

2 个答案:

答案 0 :(得分:5)

Base64是一种将二进制数据编码为可打印字符串的方法。 一个字节(8位)中有256个可能的值,其中不到一半是可打印字符。例如,你有线路向下(0xa),回车(0xc),空终端(0x0)等等。 当基于文本的协议(即SMTP)发现需要传输二进制数据时 - 需要将此数据编码为文本格式。这是Base64或MIME编码。 您使用64个可打印字符(6位)对所有二进制数据进行编码 - 这意味着您将数据膨胀了33%。它的效率非常低,但它确实有效。

Pickle是Pythons将其对象序列化(将运行时对象转换为比特流对象的过程)的方法。我相信开发该系统的工程师可以使其相对高效。

Base64不是为此而设计的。 Base64只是一种存储二进制数据的低效方法。

答案 1 :(得分:0)

Pickle与base64相比具有许多优势和功能。

例如:

class A:
    """class def here"""
    pass

a = A()

apick = pickle.dumps(a)
print(apick)

# this scenario even works when apick is send to a different python instance where A is **not** defined

b = pickle.loads(apick)

但是我认为,如果我们知道我们的实际工作,使用base64发送字节字符串会更快。