Python 是否有相当于 Javascript 的“btoa”

问题描述 投票:0回答:4

我正在尝试找到与 javascript 函数“btoa”完全相同的函数,因为我想将密码编码为 base64。然而,似乎有很多选择,如下所列:

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

Python 中是否有与 'btoa' 完全相同的东西?

javascript python base64 language-comparisons
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

如您所见,它们产生相同的结果。


14
投票

我尝试了 python 代码并得到了(使用 python3)

TypeError: a bytes-like object is required, not 'str'

当我添加编码时,它似乎起作用了

import base64

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

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

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'>

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 安装 btoa

from btoa import btoa, atob

assert btoa("Hello World!") == "SGVsbG8gV29ybGQh"
assert atob("SGVsbG8gV29ybGQh") == "Hello World!"
© www.soinside.com 2019 - 2024. All rights reserved.