Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
编码的过程:
- 将源数据三个字节三个字节分开,分别处理
- 3个字节是24Bit,平均分成4份,每一份6Bit,每一份前面补两位0,形成新的4个字节。不够4个,用零补齐,最后将无效的字节替换成b'='号
- 每一个新字节,对照Base64编码表,组成新的数据
bytes 和 int 之间的转换:
bytes.fromhex('%x' % num): Create a bytes object from a string of hexadecimal numbers.
num.to_bytes(len,'big'or'little'): int -> bytes
int.from_bytes(bytes): bytes -> int
解码即即编码的逆过程,下面是代码实现
import base64 #内部库验证
base_chrs = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
chrsdic = dict(zip(base_chrs, range(64)))
def bs64encode(src):
"""将源数据按base64编码
:param src:bytes
:return: bytes
"""
ret = bytearray()
r = 0
for i in range(0, len(src), 3):
block = src[i:i+3] #切片,超界也无所谓
if len(block) < 3:
r = 3 - len(block)
block += b'\x00' * r #用\x00补齐位数
num = int.from_bytes(block, 'big')
for j in range(4):
k = (4-j-1)*6
c = (num >> k) & 0x3f
ret.append(base_chrs[c])
for i in range(1, r+1):
ret[-i] = int.from_bytes(b'=', 'big')
return bytes(ret)
def bs64decode(src):
"""解码base64编码数据
:param src: bytes
:return: bytes
"""
ret = bytearray()
for i in range(0, len(src), 4):
block = src[i:i+4]
tmp = 0x00
cnt = 0
for j in range(4):
index = chrsdic.get(block[-j-1]) #get找不到返回None,用负索引,j就是要移动的位数
if index is not None:
tmp += index << j*6
else: #None就是遇到最后的b'=',为0,所以不用移位
cnt += 1
num = tmp.to_bytes(3, 'big') # int.to_bytes()
ret.extend(num) #bytearray 为list,方法通用
for k in range(cnt):
ret.pop()
return bytes(ret)