python - 自定义 Base64 编码器无法正确编码

标签 python python-3.x base64 encode rfc

我决定制作自己的 Base64 编码器和解码器,尽管标准库中已经有一个模块。这只是一个有趣的项目。然而,由于某种原因,编码器错误地编码了一些字符,我没有调试成功。我试着按照找到的模型 on Wikipedia开球。我相信问题与底层转换为二进制格式有关,但我不确定。

代码:

def encode_base64(data):
    raw_bits = ''.join('0' + bin(i)[2:] for i in data)
    # First bit is usually (always??) 0 in ascii characters
    
    split_by_six = [raw_bits[i: i + 6] for i in range(0, len(raw_bits), 6)]
    
    if len(split_by_six[-1]) < 6: # Add extra zeroes if necessary
        split_by_six[-1] = split_by_six[-1] + ((6 - len(split_by_six[-1])) * '0')
    
    padding = 2 if len(split_by_six) % 2 == 0 else 1
    if len(split_by_six) % 4 == 0: # See if padding is necessary
        padding = 0
    
    indexer = ([chr(i) for i in range(65, 91)] # Base64 Table
         + [chr(i) for i in range(97, 123)]
         + [chr(i) for i in range(48, 58)]
         + ['+', '/'])
    
    return ''.join(indexer[int(i, base=2)] for i in split_by_six) + ('=' * padding)

当我运行下面的示例代码时,我得到了不正确的值,您可以在下面看到:

print(base_64(b'any carnal pleasure'))
# OUTPUT: YW55QMbC5NzC2IHBsZWFzdXJl=
# What I should be outputting: YW55IGNhcm5hbCBwbGVhc3VyZS4=

出于某种奇怪的原因,前几个字符是正确的,而其余的则不正确。我很乐意回答任何问题!

最佳答案

Python 的 bin() 函数不包含前导零,因此二进制表示的长度会有所不同:

>>> bin(1)
'0b1'
>>> bin(255)
'0b11111111'
>>> bin(ord("a"))
'0b1100001'
>>> bin(ord(" "))
'0b100000'

在您的输入中,any 在它们的二进制表示中都有一个前导零,因此 的长度>bin(i) 是一致的。但是 ' ' 的二进制表示有两个前导零,所以 bin(i) 比你预期的要短一位,而其余的 raw_bits 错位。

要解决此问题,请确保用前导零填充二进制表示,直到它达到 8 个字符。我不认为有一种特别优雅的方式来做到这一点,但你可以使用 format(ord(i), "#010b")[2:] 来确保完整的表示是 10 个字符,然后丢弃 0b,留下您关心的 8。

关于python - 自定义 Base64 编码器无法正确编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63537946/

相关文章:

python - 使用 python 读取文本文件中两个字符串之间的行

python - Python中的多行f字符串

python - 从 python 中的文件路径列表加载文件

objective-c - 转换 Base64 GZipped 字符串 Objective-c 或 Swift

python - TensorFlow Serving 将数据发送为 b64 而不是 Numpy Array

python - 通过调用打印 $env :myVar=myvalue 的 python 脚本在 powershell 中设置环境变量

python - "OverflowError: Python int too large to convert to C long"在 windows 但不是 mac

macos - Python 操作系统错误 : [Errno 24] Too many open files

arrays - "Draw"3d 线到数组

ios - Xcode 中的解码和编码