0%

Base 系列

Base64

定义

Base64 是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后BinHex的版本使用不同的64字符集来代表6个二进制数字,但是不被称为Base64。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

在MIME格式的电子邮件中,Base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定Base64。使用的字符包括大小写拉丁字母各26个、数字10个、加号+和斜杠/,共64个字符,等号=用来作为后缀用途。

编码规则

  1. 将每三个字节作为一组,一共是24个二进制位
  2. 将这24个二进制位分为四组,每个组有6个二进制位
  3. 在每组前面加两个00,扩展成32个二进制位,即四个字节
  4. 根据对照表,得到扩展后的每个字节的对应符号,这就是Base64的编码值
  5. 如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。也就是说,当最后剩余两个八位字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;如果最后剩余一个八位字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。

base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。

Base32

编码规则

Base32这种数据编码机制,主要用来把二进制数据编码成可见的字符串,其编码规则是:任意给定一个二进制数据,以5个位(bit)为一组进行切分(base64以6个位(bit)为一组),对切分而成的每个组进行编码得到1个可见字符。Base32编码表字符集中的字符总数为2^5=32个,这也是Base32名字的由来。A-Z、2-7

base32就是用32(2的5次方)个特定ASCII码来表示256个ASCII码。所以,5个 ASCII 字符经过base32编码后会变为8个字符(公约数为40),长度增加3/5.不足8n用“=”补足。

#Base16

base16就是用16(2的4次方)个特定ASCII码表示256个ASCII字符。1个ASCII字符经过base16编码后会变为2个字符,长度增加一倍。不足2n用“=”补足。 0-9、 A-F。

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

def myBase64Encode(preCoding) :
charTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #字符表



if len(preCoding) < 0 :

return '' #字符串为空则返回空

lackCharNums = 3-len(preCoding)%3

if lackCharNums == 3 : lackCharNums = 0 #整除说明不缺字符

#待转换字符不是3的倍数的情况补全它

for i in range(lackCharNums) :

preCoding = preCoding + b'\x00'

result = '' #用于保存最终结果的str数据

rp = '' #处理补全字符时的暂存变量

#每三个字符处理一轮

for i in range(int(len(preCoding)/3)) :

threeChar = preCoding[i*3:i*3+3] #取三个字符出来

tCode = '' #用于存放三个字符拼接后的二进制数值 文本形式

pCode = '' #暂存变量

for j in range(3) :

pCode = bin(threeChar[j])[2:] #把省略的0补上

lackZeroNums = 8-len(pCode) #省略的0的个数

for x in range(lackZeroNums) :

pCode = '0'+pCode

tCode = tCode + pCode

pCode = ''

for j in range(4) : #每6位一个字符

pCode = tCode[j*6:j*6+6]

rp = rp + charTable[int(pCode,2)]

#处理补全的00字符

result = rp[:len(rp)-lackCharNums]

for j in range(lackCharNums) :

result = result + '='

return bytes(result,encoding="utf-8")



def myBase64Decode(encodedBin) :

charTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #字符表



#如果字符不是4的倍数 返回空

if not len(encodedBin)%4 == 0 :

return ''



tCode = '' #用于存放最终的二进制文本字符串

pCpde = '' #暂存变量

#遍历encodedBin每一个字符

for i in encodedBin :

for j in range(len(charTable)) : #找到表中对应坐标

if chr(i) == charTable[j] :

pCode = bin(j)[2:] #转二进制去除开头的0b

lackZeroNums = 6-len(pCode) #省略的0的个数

for x in range(lackZeroNums) :

pCode = '0'+pCode

tCode = tCode + pCode

pCode = ''

result = '' #储存最终结果

for i in range(int(len(tCode)/8)) :

pCode = tCode[i*8:i*8+8]

result = result + chr(int(pCode,2))

return bytes(result,encoding="utf-8")

by i春秋学院的博客