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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM