標籤:port replace 個數 lin ora 儲存 傳輸 進位轉化 語言
電腦只能處理數字,所以要處理任何文本,只能先將文本轉化為數字才行。
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)
base64編碼解碼原理