首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: base64.b64decode() vs .decode?

Python: base64.b64decode() vs .decode?
EN

Stack Overflow用户
提问于 2013-11-21 22:26:39
回答 1查看 12.1K关注 0票数 5

愤怒的代码已经把他们的恶意目光转向了我,现在轮到我来实现The Direct Project所定义的“安全传输”了。无论我们是否在内部使用DNS而不是LDAP来共享证书,我显然都需要设置前者来进行测试,这就是让我陷入困境的原因。显然,X509证书需要一些消息才能在cert记录中使用,我正在尝试弄清楚如何做到这一点。

我找到的最清晰的东西是Videntity's blog上的一个脚本,但由于不精通python,我遇到了一个绊脚石。具体地说,这一行会崩溃:

代码语言:javascript
复制
decoded_clean_pk = clean_pk.decode('base64', strict)

因为它似乎不喜欢(或者更确切地说,不知道)任何“严格”应该代表的东西。我做了一个半受过教育的猜测,认为这条线路应该解码base64数据,但几年前我从Debian OpenSSL的失败中学到了盲目地摆弄与密码相关的代码是一件坏事(TM)。

因此,我打开了著名的python书呆子,询问是否可以用下面这行替换(添加了适当的导入):

代码语言:javascript
复制
decoded_clean_pk = base64.b64decode(clean_pk)

脚本在更改后运行,并产生看起来正确的输出,但我有足够的直觉知道,在这里我不一定相信自己的直觉。:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-21 22:36:04

如果您像这样调用,这行应该是有效的:

代码语言:javascript
复制
decoded_clean_pk = clean_pk.decode('base64', 'strict')

请注意,strict必须是一个string,否则python解释器将尝试搜索一个名为strict的变量,如果它没有找到该变量,或者它具有strictignorereplace以外的其他值,它可能会抱怨这个问题。

请看下面的代码:

代码语言:javascript
复制
>>>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

更新:实际上是,我想这是最重要的例子:)看看decode()使用的encodings/base64_codec.py的源代码:

代码语言:javascript
复制
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模块来完成此操作:)

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20123544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档