zoukankan      html  css  js  c++  java
  • base64编码解码原理

    计算机只能处理数字,所以要处理任何文本,只能先将文本转化为数字才行。

    Bit(bit)(b) 位或比特,是计算机运行的基础,属于二进制的范畴。数据传输大多是以【位】为单位,一个位即代表一个0或者1(即二进制),每8个位组成一个字节。

    Byte(B)字节,是计算机中文件大小的基本计量单位。数据存储就是以字节为单位。1B = 8b。所以一个字节最大能表述的数字是255【11111111】

    编码:

    ASCII编码:1个字节,所以只能处理英文数字和一些符号。

    UNICODE编码:通常是2个字节,它把所有语言都统一到一套编码中,因此解决了乱码问题,但是随之而来的是,存储空间的浪费。如文中大量的英文,每个字符都需要2个字节的存储空间

    UTF8编码:UTF8结合了二者的优缺点,它是可变长编码方式。它把一个UNICODE字符根据不同的数字大小,编码成1--6个字节,常用英文字母为1个字节,汉字通常3个字节。

    在计算机内存中,通常采用Unicode编码,在需要保存到硬盘或需要传输的时候,就转化为utf8。

    python中,提供了ord()函数获取字符的整数表示。

     BASE64编码由64个字符组成,编码后的字符由表中字符组合而成,具体流程如下:

      1)base64编码都是按照字符串长度分组,以每3个8位字节为一组,不足3个一组的,补0,编码完成后补=

      2)获取每组的每个字符的ASCII码

      3)将ASCII码转化为8位的二进制,即每组为3*8=24位的长度

      4)将24位划分为4个6位的字节,并在每个6位字节前补2个0,重新组成8位的字节

      5)将新组成的8位的字节转化为十进制,查找对应的base64编码表。

      用代码表示如下(以下只支持英文直接转化):

      import string

      base64_char = string.ascii_uppercase + string.ascii_lowercase + string.digits+'+/'   # base64编码表

      def decode(s):

        num = 0 if (3-len(s)%3)==3 else (3-len(s)%3)   # 分组后不足待补齐的个数

        new_s = ["{:0>8}".format(bin(ord(i)).replace("0b","")) for i in s]  # 将字符串转化为8为的二进制

        new_s ="".join( [new_s.append("0"*8) for x in range(num)])   # 对于不足3个分组的,补齐0

        num1 = int(new_s/6)  # 重新以6位为一组,可以分的组数量

        new_s = ["{:0>8}".format(new_s[i*6:(i+1)*6]) for i in range(num1)]  # 将新的分组补齐为8位

        new_s = [int(x,2) for x in new_s]  # 将新的二进制转化为10进制

        result = "".join([base64_char[i] for i in new_s])+"="*num  # 对应的查编码表并补齐=

        print(result)

      

      对应的解码,即将上面的函数反向执行:

      def decode(s):

        while s[-2:-1]=="=":

          s = s.replace("=","")  # 将补齐的=号去掉

        s1 = ["{:0>6}".format(bin(base64_char.index(x)).replace("0b","")) for x in s]  # 查找编码表,找到对应的位置,并转化为二进制

        s1 = "".join(s1)

        num = len(s1)//8  # 计算出分组数量

        s2 = [s1[x*8:(x+1)*8]  for x in range(num)]  # 转化为8位一组的字节

        s2 = [chr(int(s1[index],2)) for index in range(num)]

        result = "".join(s2)

        print(result)

        

  • 相关阅读:
    php2
    11-14php
    三层嵌套
    常见的浏览器兼容
    css中的一些问题及解决方法
    css
    html
    测试题
    正则表达式
    Math对象
  • 原文地址:https://www.cnblogs.com/fiona-zhong/p/9884711.html
Copyright © 2011-2022 走看看