base16,32,64 base编码和解码方法

base16,32,64 base编码和解码方法

在网络传入字符串过程中,如果编码方式是基于ASCII,那么会造成什么问题?比如:url地址中存在"/"(如:www.csdn.net/nav/ai),字符串中编码中也存在"/",这样就会出现错误地址解析.为了防止这种情况的出现,出现了Base16,Base32,Base64编码方式.我们知道计算机传输的单位是字节,也就是8个比特位,按照一个字节编码的方式结果就有256种状态(每个比特位0或者1两种状态,8位就是=256),ASCII编码是将8个比特位中最高位置为0,所以总共可表示128个字符(即=128).为了避免冲突,去掉一些特殊字符,重新编码.例如Base16编码,编码后的字符只会在(09,AF)中,Base32编码后字符就会在(A~Z, 2~7)中以及填充符"="中出现.

Base16编码是包含了数字(09)和大写字母(AF),Base32编码与Base64编码最大区别是前者没有小写字母.Base32编码可以用于文件系统的名称(不区分大小情况).而Base64编码后数据量相比原先不是增加很多,可以用于网络传输.(比如下载链接)

base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

规则
关于这个编码的规则:

  • ①.把3个字节变成4个字节。
  • ②每76个字符加一个换行符。
  • ③.最后的结束符也要处理。

python – a85encode和b85encode有什么区别?

Ascii85是Base85的前身;两者之间的主要区别实际上是使用的字符集.
Ascii85使用字符集:
ASCII 33 ("!") to ASCII 117 ("u")
Base85使用字符集:
0–9, A–Z, a–z, !#$%&()*+-;<=>?@^_~`
这些字符特别不包含在Base85中:
`"',./:[]\`
a85encode和b85encode分别编码/解码Ascii85和Base85.

前言

python当中有关base16、base32和base64的编码及解码方法,须使用base64库,这个库是下载python时自带的,直接import即可

函数介绍

在使用编码的函数之前,需要对字符串进行utf-8编码一下,不然python的base64库的函数没法识别对应的字符串而报错

函数	介绍
base64.b16encode(字符串)	对字符串进行base16编码
base64.b16decode(字符串)	对字符串进行base16解码
base64.b32encode(字符串)	对字符串进行base32编码
base64.b32decode(字符串)	对字符串进行base32解码
base64.b64encode(字符串)	对字符串进行base64编码
base64.b64decode(字符串)	对字符串进行base64解码

算法

  • base16

    编码或解码后的字符串前会带一个小写的b标识,进行编码之前需要设置字符串为utf-8,解码时不需要

    编码方法:base64.b16encode(字符串)

    解码方法:base64.b16decode(字符串)

  • base32

    编码或解码后的字符串前会带一个小写的b标识,进行编码之前需要设置字符串为utf-8,解码时不需要

    编码方法:base64.b32encode(字符串)

    解码方法:base64.b32decode(字符串)

  • base64

    编码或解码后的字符串前会带一个小写的b标识,进行编码之前需要设置字符串为utf-8,解码时不需要

    编码方法:base64.b64encode(字符串)

    解码方法:base64.b64decode(字符串)

  • base64_encode(data: bytes)

def base64_encode(data: bytes) -> bytes:
    """Encodes data according to RFC4648.
  • RFC4648

代码

[base16.py]{..\src\ciphers\base16.py}

[base32.py]{..\src\ciphers\base32.py}

[base64_encoding.py]{..\src\ciphers\base64_encoding.py}

[base85.py]{..\src\ciphers\base85.py}

"""
Prepare
   1. sys.path 中增加 TheAlgorithms\src 子模块

"""
import sys
sys.path.append('E:\dev\AI\TheAlgorithms\src')

案例一: base16

Encodes a given utf-8 string into base-16.

    >>> encode_to_b16('Hello World!')
    b'48656C6C6F20576F726C6421'
    >>> encode_to_b16('HELLO WORLD!')
    b'48454C4C4F20574F524C4421'
    >>> encode_to_b16('')
    b''
from ciphers.base16 import encode_to_b16
import base64
"""
    
"""
t = encode_to_b16('Hello World!')
print(type(t))
print (t)   #  b'48656C6C6F20576F726C6421'
print(base64.b16decode(t))

t = encode_to_b16('HELLO WORLD!')
print (t)   #   b'48454C4C4F20574F524C4421'
print(base64.b16decode(t))

t = encode_to_b16('')
print (t)   #     b''
print(base64.b16decode(t))

<class 'bytes'>
b'48656C6C6F20576F726C6421'
b'Hello World!'
b'48454C4C4F20574F524C4421'
b'HELLO WORLD!'
b''
b''

案例二: base32

base64.b32encode
base64.b32dncode
import base64

# inp = input("->")
inp = "erwerwerwerwe"
encoded = inp.encode("utf-8")  # encoded the input (we need a bytes like object)
b32encoded = base64.b32encode(encoded)  # b32encoded the encoded string
print("b32encode:"+str(b32encoded))
print("b32decode:"+base64.b32decode(b32encoded).decode("utf-8"))  # decoded it
b32encode:b'MVZHOZLSO5SXE53FOJ3WK==='
b32decode:erwerwerwerwe

案例三: base64

base64.b64encode
base64.b64dncode
def base64_encode(data: bytes) -> bytes:
    """Encodes data according to RFC4648.
from ciphers.base64_encoding import base64_encode,base64_decode
from base64 import b64encode,b64decode
"""
    
"""
a = b"This pull request is part of Hacktoberfest20!"
b = b"https://tools.ietf.org/html/rfc4648"
c = b"A"

print("a: "+str(a))
print ("base64_encode(a): " + str(base64_encode(a)))
print("base64_encode(a) == b64encode(a) :"+str(base64_encode(a) == b64encode(a))) #    True


print("b: "+str(b))
print ("base64_encode(b): " + str(base64_encode(b)))
print("base64_encode(b) == b64encode(b) :"+str(base64_encode(b) == b64encode(b))) #    True

print("c: "+str(c))
print ("base64_encode(c): " + str(base64_encode(c)))
print("base64_encode(c) == b64encode(c) :"+str(base64_encode(c) == b64encode(c))) #    True


a = "VGhpcyBwdWxsIHJlcXVlc3QgaXMgcGFydCBvZiBIYWNrdG9iZXJmZXN0MjAh"
b = "aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDg="
c = "QQ=="

print("a: "+str(a))
print ("base64_decode(a): " + str(base64_decode(a)))
print("base64_dncode(a) == b64dncode(a) :"+str(base64_decode(a) == b64decode(a))) #    True

print("b: "+str(b))
print ("base64_decode(b): " + str(base64_decode(b)))
print("base64_dncode(b) == b64dncode(b) :"+str(base64_decode(b) == b64decode(b))) #    True

print("c: "+str(c))
print ("base64_decode(c): " + str(base64_decode(c)))
print("base64_dncode(c) == b64dncode(c) :"+str(base64_decode(c) == b64decode(c))) #    True
# base64_decode("abc")    # AssertionError: Incorrect padding
    
a: b'This pull request is part of Hacktoberfest20!'
base64_encode(a): b'VGhpcyBwdWxsIHJlcXVlc3QgaXMgcGFydCBvZiBIYWNrdG9iZXJmZXN0MjAh'
base64_encode(a) == b64encode(a) :True
b: b'https://tools.ietf.org/html/rfc4648'
base64_encode(b): b'aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDg='
base64_encode(b) == b64encode(b) :True
c: b'A'
base64_encode(c): b'QQ=='
base64_encode(c) == b64encode(c) :True
a: VGhpcyBwdWxsIHJlcXVlc3QgaXMgcGFydCBvZiBIYWNrdG9iZXJmZXN0MjAh
base64_decode(a): b'This pull request is part of Hacktoberfest20!'
base64_dncode(a) == b64dncode(a) :True
b: aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDg=
base64_decode(b): b'https://tools.ietf.org/html/rfc4648'
base64_dncode(b) == b64dncode(b) :True
c: QQ==
base64_decode(c): b'A'
base64_dncode(c) == b64dncode(c) :True

案例四: base64.a85encode

import base64

inp = "dewewew"
# inp = input("->")
encoded = inp.encode("utf-8")  # encoded the input (we need a bytes like object)
a85encoded = base64.a85encode(encoded)  # a85encoded the encoded string
print(a85encoded)
print(base64.a85decode(a85encoded).decode("utf-8"))  # decoded it
b'A7]srG@bs'
dewewew

posted @ 2021-06-04 15:05  IT88老兵  阅读(2385)  评论(0编辑  收藏  举报