如何在python3中使用自定义字母集(用户提供)进行base64编码?

2024-09-29 02:22:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python3中的自定义字符集进行base64编码。我在SO中看到的大多数示例都与python2相关,因此我不得不对代码进行一些小的调整。我面临的问题是,我正在用_替换字符/,但它仍然用/打印。我的代码是:这只是一个示例,我并不是只尝试使用带有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='

如何使翻译工作,以便/的出现被_正确替换?你知道吗

编辑

我应该明确指出,我并不是只尝试在这里使用一种base64编码,比如urlsafe,而是任何可能的字符集。这将是一个函数,用户可以通过自己的字符集。我在寻找一个字符的字符映射,而不是字符串切片。你知道吗

编辑

因为我的问题的清晰性有些混乱,我想补充更多细节。你知道吗

我正在尝试编写一个函数,可以从用户获取任意字符集,然后在base64编码之前分别映射它们。大多数答案都是围绕着操作altchars或字符串切片和替换,但这并不能解决所有的需求。你知道吗

例如,itoa64字符集是: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=或unix crypt格式为./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz。这些答案虽然正确,但并不能解决这些情况。你知道吗


Tags: 代码示例编码datacustom字符encodestd
2条回答

如果要切换的字符只有+\,则可以使用base64.urlsafe_b64encode分别替换为-_。你知道吗

>>> base64.urlsafe_b64encode(data.encode())
b'c29tZSByYW5kb20_IGRhdGE='

或者,您可以使用base64.b64encode的可选参数将这些字符替换为您自己选择的字符:

>>> base64.b64encode(data.encode(), '*&'.encode())
b'c29tZSByYW5kb20&IGRhdGE='

如果你需要使用一个全新的字母表,你可以这样做

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

输出:

b'c29tZSByYW5kb20/IGRhdGE='
b'C29TzsbYyw5KB20_igrHDge='

这不应该起作用吗:

import base64


data = 'some random? data'

custom = b"-_"

rslt = base64.b64encode(data)
print(rslt)

rslt = base64.b64encode(data, altchars=custom)
print(rslt)

我得到以下输出:

c29tZSByYW5kb20/IGRhdGE=
c29tZSByYW5kb20_IGRhdGE=

或者如果你坚持的话,这个习俗包含:

custom = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"

然后使用:

rslt = base64.b64encode(data, altchars=custom[-2:])

相关问题 更多 >