sec*_*sec 1 python string base64 encoding python-3.x
我正在尝试使用 python3 中的自定义字符集进行 Base64 编码。我在 SO 中看到的大多数示例都与 Python 2 相关,因此我不得不对代码进行一些细微的调整。我面临的问题是我正在用 替换字符/,_但它仍然用 打印/。我的代码是:这只是一个示例,我不尝试仅使用 urlsafe 字符进行 base64。custom可以是任何具有正确长度的东西。
import base64
data = 'some random? data'
print(base64.b64encode(data.encode()))
std_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
custom = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
data = data.translate(str.maketrans(custom, std_base64chars)).encode()
print(base64.b64encode(data))
# Both prints
b'c29tZSByYW5kb20/IGRhdGE='
b'c29tZSByYW5kb20/IGRhdGE='
Run Code Online (Sandbox Code Playgroud)
如何使翻译正常工作,以便将出现的/正确替换为_?
我应该明确的是,我并不是试图在这里只进行一种类型的 Base64 编码(例如 urlsafe),而是尝试任何可能的字符集。这将是一个用户可以传递自己的字符集的函数。我正在寻找逐个字符的映射,而不是字符串切片。
由于我的问题的清晰度存在一些混乱,因此我尝试添加更多细节。
我正在尝试编写一个函数,该函数可以从用户处获取任意字符集,然后在 Base64 编码之前单独映射它们。大多数答案都是围绕操作altchars或字符串切片和替换,但这并不能解决所有需求。
例如,itoa64 字符集是:
./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=或 unix crypt 格式是./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz。答案虽然正确,但没有解决这些情况。
如果您想要切换的唯一字符是+和\,则可以分别使用和base64.urlsafe_b64encode()进行替换。-_
>>> base64.urlsafe_b64encode(data.encode())
b'c29tZSByYW5kb20_IGRhdGE='
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用可选参数将这些字符替换为您自己选择的字符base64.b64encode():
>>> base64.b64encode(data.encode(), '*&'.encode())
b'c29tZSByYW5kb20&IGRhdGE='
Run Code Online (Sandbox Code Playgroud)
如果您需要使用全新的字母表,您可以这样做
import base64
data = 'some random? data'
print(base64.b64encode(data.encode()))
std_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
custom = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
x = base64.b64encode(data.encode())
print(bytes(str(x)[2:-1].translate(str(x)[2:-1].maketrans(std_base64chars, custom)), 'utf-8'))
Run Code Online (Sandbox Code Playgroud)
哪个输出:
b'c29tZSByYW5kb20/IGRhdGE='
b'C29TzsbYyw5KB20_igrHDge='
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8022 次 |
| 最近记录: |