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()))