zoukankan      html  css  js  c++  java
  • Python base64

    base64表示一种使用64个字符表示任意二进制数据的方法,注意64个字符是可以自己定义的

    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017684507717184

      用记事本打开exejpgpdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。

    原理

      首先准备一个包含64个字符的数组,这就相当于Ascii编码中的Ascii表,根据下面的算法得出的数过来查表,得到的一个一个的字符就是最后将二进制进行base64编码得到的字符串

    ['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
    

      然后,对二进制数据进行处理,每3个字节一组,一个字节是8bit,一共是3x8=24bit,又将这3组划为4组,每组正好6个bit:

      然后将这6bit转为10进制的数,(6bit的二进制数刚好能表示0-63,就是64个数 )作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。

    使用

    以上就是base的编码原理,所以,根据自己定义的64个字符串的不同,同样的二进制文件可能也有不同的结果

      另外,上面分组的过程中,我们将二进制文件分为3个字节的组,那么当二进制的长度不是3的倍数会怎么办呢,Base64用x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

    >>> base64.b64encode(b'x00x00x00')
    b'AAAA'
    >>> base64.b64encode(b'x00x00')
    b'AAA='#就不查表了,直接用等号表示,这样并不会造成之前的字节中的数据丢失,因为在解码的时候,将等号变为相应的x00,在通过表把base64编码转为二进制字节时,你会发现这样并不会
    >>>
    

      

      Python内置的base64可以直接进行base64的编解码:

    >>> import base64
    >>> base64.b64encode(b'binaryx00string')
    b'YmluYXJ5AHN0cmluZw=='
    >>> base64.b64decode(b'YmluYXJ5AHN0cmluZw==')
    b'binaryx00string'
    

      由于标准的Base64编码后可能出现字符+/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+/分别变成-_(略)

      还可以自己定义64个字符的排列顺序,这样就可以自定义Base64编码,不过,通常情况下完全没有必要。

      Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。

      Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。

      由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉:

    # 标准Base64:
    'abcd' -> 'YWJjZA=='
    # 自动去掉=:
    'abcd' -> 'YWJjZA'
    

      去掉=后怎么解码呢?因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了。(因为等号是怎么加的,加等号是为了 表示x00字节在末尾补足的个数)

    Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。

     

  • 相关阅读:
    Android -- 在一个Activity开启另一个Activity 并 获取他的返回值。
    Android -- Activity的生命周期,Activity四种启动模式 Standard, SingleTop,SingleTask,SingleInstance
    Python3 如何优雅地使用正则表达式(详解七)
    Python3 如何优雅地使用正则表达式(详解六)
    Python3 如何优雅地使用正则表达式(详解五)
    Python3 如何优雅地使用正则表达式(详解四)
    Python3 如何优雅地使用正则表达式(详解三)
    Python3 如何优雅地使用正则表达式(详解一)
    Windows编程中的若干难点
    魔法方法:算术运算
  • 原文地址:https://www.cnblogs.com/Gaoqiking/p/11610417.html
Copyright © 2011-2022 走看看