Base64编码原理及Python实现方法

BASE64介绍

该算法被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式,达到一眼望去完全看不出内容。此算法的复杂程度要小,效率高。如果是基于以上两点,那么我们使用最简单的单字母代替法等即可,实际上Base64要稍微复杂些,这是因为在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。

编码规则

把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),再根据每个字节的值,用base64编码表中的值替换,不足4个字节的,补“=”。编码得到的字符串长度必为4的倍数。

常规base64编码表范围为 [A-Za-z0-9+/] 共64个字符,在实际应用时编码表经常会有所变化。=号为填充字符。

Base64编码表序列是由0开始到63结束的,共64个字符。

Base64编码表

序列值对应编码序列值对应编码序列值对应编码序列值对应编码
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q589
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

编码步骤:

1、 将待编码字符串各个字符换为对应ASCII码值

2、 将得到的ASCII码值转换为8位二进制

3、 将得到的8位二进制序列分割为6位一组(不足6位的末尾添0补上)

4、 将每个6位二进制数列转换为十进制数字。(6位二进制最大值为63)

5、将转换所得的十进制值对应Base64编码表中的字符进行替换

6、若编码所得字符串长非4倍,添一个或两个“=”补上

解码步骤:

1、将待解码字符串中的字符对应查找Base64编码表中的序列值(末尾的“=”直接忽略)

2、将所得对应序列值转换为6位二进制字串

3、将所有6位二进制字串按8位分割

4、将每个8位二进制字串转换为十进制

5、十进制值对应的ASCII字符串即为结果

示例(待编码字符长度刚好为3的倍数):

在这里插入图片描述

示例(待编码字符长度无法被3整除):

在这里插入图片描述

在这里插入图片描述

python实现

base64_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

def btoa():     # base64编码函数
    s = input("input string to encode:\n")
    n = len(s) % 3
    x = ''
    asc = []
    for i in range(len(s)):
        asc.append(ord(s[i]))               #取各字符ascii值
        x += '{:08b}'.format(asc[i])        #将各字符ascii值转为二进制
    if n:
        x += '0'*2 *(3-n)                   #长度非3倍的结尾补零
    i = 0
    out = ''
    while i<len(x):
        out += base64_table[int(x[i:i+6],2)]
        i += 6
    if n:
        out += '=' *(3-n)					#补上'='使编码后长度为4倍
    print(out)

def atob():             #base64解码函数
    s = input("input string to decode:\n")
    b64 = []
    x = ''
    for i in range(len(s)):
        if s[i] == '=':
            b64.append(0)
        else:
            for j in range(64):
                if(s[i] == base64_table[j]):
                    b64.append(j)
                    break
        x += '{:06b}'.format(b64[i])
    
    print(x)
    i = 0
    out = ''
    while i<len(x):
        if int(x[i:i+8],2):
            out += chr(int(x[i:i+8],2))
        i += 8
    print(out)

def main():
    m = input('Input 1/2 to encode/decode:\n')
    if m == '1':
        btoa()
    elif m == '2':
        atob()
    else:
        print('Error! Please restart the process!')

main()


参考博文:

关于base64编码的原理及实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值