Python:base64.b64decode()与.decode()有何不同?

5
Code Furies已经对我怒目而视,现在我需要按照The Direct Project所定义的方式实现“安全传输”。无论我们是使用DNS还是LDAP来共享证书,我显然都需要设置前者进行测试,但这就让我陷入了困境。显然,X509证书需要进行一些处理才能用于CERT记录,我正在努力弄清楚如何处理。
最清晰的东西是Videntity's blog上的一个脚本,但由于我不精通Python,所以遇到了障碍。具体来说,这行代码会导致崩溃:
decoded_clean_pk = clean_pk.decode('base64', strict)

由于它似乎不喜欢(或者更确切地说,不知道)“strict”代表的是什么。我有点半知半解地猜测这一行代码应该是用来解码base64数据的,但我从几年前的Debian OpenSSL事件中学到了盲目摆弄与加密相关的代码是一件不好的事情(TM)。

因此,我向SO上杰出的Python专家求助,问是否可以用这行代码替换它(同时添加适当的导入):

decoded_clean_pk = base64.b64decode(clean_pk)

脚本在更改后运行,并生成正确的输出,但我有足够的直觉知道我不能完全相信我的直觉。 :)

我更新了答案,加入了最终的例子!;) - Paulo Bu
1个回答

5

如果您像这样调用,这行代码应该可以工作:

decoded_clean_pk = clean_pk.decode('base64', 'strict')

请注意,strict必须是一个字符串,否则Python解释器会尝试搜索名为strict的变量,如果未找到或者值不是strictignorereplace中的任何一种,则可能会报错。
看看这段代码:
>>>b=base64.b64encode('hello world')
>>>b.decode('base64')
'hello world'

>>>base64.b64decode(b)
'hello world'

当传递.decode参数为base64字符串时,decodeb64decode的作用相同。

区别在于,str.decode将采用字节串作为参数,并根据您传递的第一个参数encoding返回其Unicode表示形式。在本例中,您告诉它处理一个bas64字符串,所以它会正常工作。

回答您的问题,两者效果相同,尽管b64decode/encode仅用于base64编码,而str.decode可以处理库已知的许多编码方式。

如需更多信息,请阅读以下两个文档部分:decodeb64decode

更新:实际上,这可能是最重要的示例 :) 看看encodings/base64_codec.py的源代码,该代码使用了decode()

def base64_decode(input,errors='strict'):

    """ Decodes the object input and returns a tuple (output
        object, length consumed).

        input must be an object which provides the bf_getreadbuf
        buffer slot. Python strings, buffer objects and memory
        mapped files are examples of objects providing this slot.

        errors defines the error handling to apply. It defaults to
        'strict' handling which is the only currently supported
        error handling for this codec.

    """
    assert errors == 'strict'
    output = base64.decodestring(input)
    return (output, len(input))

正如您所看到的,它实际上使用base64模块来完成这个操作 :)

希望这在某种程度上澄清了你的问题。


谢谢!我很感激你的帮助。总有一天,我会学习Python的方式去做事情 :) - GeminiDomino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接