Python是否有类似于JavaScript中的'btoa'的等效函数?

20

我正在尝试找到与JavaScript中的函数“btoa”完全相同的Python等效函数,因为我想将密码编码为base64。 似乎有许多选项,如此处所列:

https://docs.python.org/3.4/library/base64.html

在Python中是否存在与“btoa”完全相同的等效函数?

4个回答

27

Python的Base64

import base64

encoded = base64.b64encode(b'Hello World!')
print(encoded)

# value of encoded is SGVsbG8gV29ybGQh

Javascript的btoa方法:

var str = "Hello World!";
var enc = window.btoa(str);

var res = enc;

// value of res is SGVsbG8gV29ybGQh

正如您所看到的,它们都会产生相同的结果。


虽然这样是可行的,但最好像Shlomi Lachmish所写的那样(明确编码文本)。引用另一个SO答案:“_为了可靠地发送文本,您可以先使用自己选择的文本编码(例如UTF-8)将其编码为字节,然后将结果二进制数据Base64编码为安全发送的文本字符串。作为ASCII编码。_”- https://dev59.com/ynA65IYBdhLWcg3w-jum#3538079. 另请参见:https://dev59.com/5-o6XIcBkEYKwwoYTy4d - blong

14

我尝试了Python代码,并得到了以下错误(在python3下):TypeError:需要字节类似对象,而不是'str'

当我添加了编码时,它似乎可以工作。

import base64

dataString = 'Hello World!'
dataBytes = dataString.encode("utf-8")
encoded = base64.b64encode(dataBytes)

print(encoded)  # res=> b'SGVsbG8gV29ybGQh'

encoded = base64.b64encode(b'Hello World!') 这行代码也是有效的。 - user3556757

0

如果你在使用Django,通常类型会有一些棘手的问题。

import json
import base64


data = [{"a": 1, "b": 2}]

btoa = lambda x:base64.b64decode(x)
atob = lambda x:base64.b64encode(bytes(x, 'utf-8')).decode('utf-8')

encoded = atob(json.dumps(data))
print(encoded)
# W3siYSI6IDEsICJiIjogMn1d
print(type(encoded))
# <class 'str'>

decoded = json.loads(btoa(encoded))
print(decoded)
# [{'a': 1, 'b': 2}]
print(type(decoded))
# <class 'list'>

1
根据MDN文档,这些函数名称被交换了。 "btoa()方法从二进制字符串(即,将字符串中的每个字符视为二进制数据字节)创建一个Base64编码的ASCII字符串。" 而atob "atob()函数解码使用Base64编码的数据字符串。"因此,如果将函数命名为btoa进行编码和atob进行解码,则可能会更好。 - elgreg
1
根据MDN文档所述,这些函数名称被颠倒了。"btoa()方法从二进制字符串(即,将字符串中的每个字符视为二进制数据的字节)创建一个Base64编码的ASCII字符串。"而atob函数"解码使用Base64编码的数据字符串。"因此,如果将函数命名为btoa用于编码,atob用于解码可能会更好。 - undefined

0
我在WebKit中研究了btoa源代码,它使用的是Latin-1编码而不是UTF-8。在使用Latin-1编码之后,一切都按照预期运行。
from base64 import b64encode, b64decode


def btoa(value: str) -> str:
    # btoa source: https://github.com/WebKit/WebKit/blob/fcd2b898ec08eb8b922ff1a60adda7436a9e71de/Source/JavaScriptCore/jsc.cpp#L1419
    binary = value.encode("latin-1")
    return b64encode(binary).decode()


def atob(value: str) -> str:
    binary = b64decode(value.encode())
    return binary.decode("latin-1")

我为了方便而创建了一个库:

pip install btoa

from btoa import btoa, atob

assert btoa("Hello World!") == "SGVsbG8gV29ybGQh"
assert atob("SGVsbG8gV29ybGQh") == "Hello World!"

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