base64 encode / python
base64编码原理以及py实现 刚用hexo 不太熟悉markdown排版不来 之前一直在使用base64的解码 像是py中直接 import base64 base64.b64decode() 就可以完成解码 但是一直不知道base64的编码原理
Base64由来:
为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种 基于64个可打印字符(26*2+10+2)来表示二进制数据的表示方法。
编码原理: 1.先将原始目标转化为2进制 2.3字节一组不足3字节的用0补齐 设补齐n个字节 则要在最后的密文后面加上3-n个=号 3.每组按照: 6个2进制位为一个新字节前端补2个0得到8个2进制位 那么3*8 24个2进制位最后变成 24/6 4个新字节
举个栗子:
11010111 01010101 11110000
->
00110101 00110101 00010111 00110000
4.将得到的结果在表中查找得到可显示字母最终加上3-n个=号的到最终的密文
解码: 解码是编码的逆过程 这里不做多解释
然后用python实现了编码过程: python3.6环境 –因为Python2不太清楚如何str转换成byte
code:
#encoding=utf8
import base64
table='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
def encode(byteArray):
charArray = [0] * (((len(byteArray) + 2) // 3) * 4)
val = 0
groupIndex = 0
groupCount = 0
# print(byteArray)
for index, byte in enumerate(byteArray):
if index % 3 == 0:
val = (0xFF & byte)
# print(val)
groupCount += 1
elif index % 3 == 1:
val <<= 8
# print(val)
val |= (0xFF & byte)
groupCount += 1
elif index % 3 == 2:
val <<= 8
val |= (0xFF & byte)
for i in range(4):
# print(groupIndex * 4 + (3 - i))
charArray[groupIndex * 4 + (3 - i)] = table[val & 0x3F]
# print(charArray[groupIndex * 4 + (3 - i)])
val >>= 6
groupIndex += 1
groupCount = 0
else:
if groupCount > 0:
for i in range(3 - groupCount):
val <<= 8
for j in range(4):
if j < 3 - groupCount:
charArray[groupIndex * 4 + (3 - j)] = '='
val >>= 6
else:
charArray[groupIndex * 4 + (3 - j)] = table[val & 0x3F]
val >>= 6
return "".join(charArray)
def encode_2(raw):
result=[0]*((int((len(raw)-1)/3)+1)*4)
rest=len(raw)%3
ct=0;
for index,byte in enumerate(raw):
if(index%3==0):
val=byte&0xff
# print(val)
else:
val <<=8
# print(val)
val|=byte&0xff
if(index%3==2):
for x in range(4):
result[ct * 4 + 3 - x] = table[val & 0x3f]
val>>=6
ct+=1;
val=0;
else:
if(rest==1):
val<<=16
if(rest==2):
val<<=8
if(rest!=0):
for x in range(4):
if x < 3 - rest:
result[ct * 4 + (3 - x)] = '='
val >>= 6
else:
result[ct * 4 + (3 - x)] = table[val & 0x3F]
val >>= 6
return "".join(result)
table='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
raw='asdasdasdasda'
print(encode(raw.encode()))
print(encode_2(raw.encode()))
print(base64.b64encode(raw.encode()))