base64 string类 放不下_为什么我需要'b'来编码Base64的字符串?

简答

你需要一个推bytes-like对象(bytes,bytearray,等)的base64.b64encode()方法。这有两种方式:

>>> data = base64.b64encode(b'data to be encoded')

>>> print(data)

b'ZGF0YSB0byBiZSBlbmNvZGVk'

或者使用变量:

>>> string = 'data to be encoded'

>>> data = base64.b64encode(string.encode())

>>> print(data)

b'ZGF0YSB0byBiZSBlbmNvZGVk'

为什么?

在Python 3中,str对象不是C风格的字符数组(因此它们不是字节数组),而是它们是没有任何固有编码的数据结构。您可以通过各种方式对该字符串进行编码(或解释它)。最常见的(在Python 3中是默认的)是utf-8,特别是因为它向后兼容ASCII(尽管是最广泛使用的编码)。这就是当你接受string并调用.encode()方法时发生的事情:Python正在解释utf-8中的字符串(默认编码)并为你提供它所对应的字节数组。

Python 3中的Base-64编码

最初问题标题是关于Base-64编码的。继续阅读Base-64的内容。

base64编码采用6位二进制块并使用字符AZ,az,0-9,'+','/'和'='对它们进行编码(某些编码使用不同的字符代替'+'和'/') 。这是一个基于radix-64或base-64数字系统的数学结构的字符编码,但它们是非常不同的。数学中的Base-64是一个数字系统,如二进制或十进制,你可以在整个数字上进行基数更改,或者(如果你转换的基数是2的幂小于64)从右到右的块剩下。

在base64编码中,翻译是从左到右完成的; 那些前64个字符就是它被称为base64 编码的原因。第65个'='符号用于填充,因为编码拉取6位块,但通常要编码的数据是8位字节,因此有时在最后一个块中只有两个或4个位。

例:

>>> data = b'test'

>>> for byte in data:

...     print(format(byte, '08b'), end=" ")

...

01110100 01100101 01110011 01110100

>>>

如果您将该二进制数据解释为单个整数,那么您可以将其转换为base-10和base-64(base-64的表):

base-2:  01 110100 011001 010111 001101 110100 (base-64 grouping shown)

base-10:                            1952805748

base-64:  B      0      Z      X      N      0

base64 但是,编码会重新对这些数据进行分组:

base-2:  011101  000110  010101 110011 011101 00(0000)

base-10:     29       6      21     51     29      0

base-64:      d       G       V      z      d      A

因此,'B0ZXN0'是我们二进制的base-64版本,从数学上讲。但是,base64 编码必须以相反的方向进行编码(因此原始数据转换为'dGVzdA'),并且还有一条规则告诉其他应用程序在结尾处剩余多少空间。这是通过用'='符号填充末尾来完成的。因此,base64该数据的编码是'dGVzdA ==',其中两个'='符号表示当该数据被解码以使其与原始数据匹配时,将需要从末端移除两对比特。

让我们测试一下,看看我是不是在做不诚实:

>>> encoded = base64.b64encode(data)

>>> print(encoded)

b'dGVzdA=='

为何使用base64编码?

假设我必须通过电子邮件向某人发送一些数据,例如:

>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'

>>> print(data.decode())

>>> print(data)

b'\x04msg\x08\x08\x08   '

>>>

我种了两个问题:

如果我尝试在Unix中发送该电子邮件,则一旦\x04读取该字符,该电子邮件就会发送,因为这是END-OF-TRANSMISSION(Ctrl-D)的ASCII ,因此剩余的数据将被排除在传输之外。

此外,虽然Python足够聪明,可以在我直接打印数据时逃避所有恶意控制字符,但当该字符串被解码为ASCII时,您可以看到'msg'不存在。那是因为我使用了三个BACKSPACE字符和三个SPACE字符来删除'msg'。因此,即使我没有EOF那里的角色,最终用户也无法从屏幕上的文本转换为真实的原始数据。

这只是一个演示,向您展示简单地发送原始数据是多么困难。将数据编码为base64格式可为您提供完全相同的数据,但格式可确保通过电子邮件等电子媒体进行发送是安全的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值