Python Base 64 編碼,pythonbase64編碼

來源:互聯網
上載者:User

Python Base 64 編碼,pythonbase64編碼

0x00 Base64簡介

0x01 常用情境舉例

0x02 編、解碼流程

0x03 Python中Base64編碼與解碼

 

 

0x00 Base64簡介

    我們知道在電腦中任何資料都是按ascii碼儲存的,而ascii碼的128~255之間的值是不可見字元。而在網路上交換資料時,比如說從A地傳到B地,往往要經過多個路由裝置,由於不同的裝置對字元的處理方式有一些不同,這樣那些不可見字元就有可能被處理錯誤,這是不利於傳輸的。所以就先把資料先做一個Base64編碼,統統變成可見字元,這樣出錯的可能性就大降低了。 

此處摘自:https://www.zhihu.com/question/36306744/answer/71626823

編碼取值範圍:大寫字母(A-Z),小寫字母(a-z),數字(0-9),特殊字元:'+' 和 '/'  一共64個字元。

 

0x01 常用情境舉例

     舉例1 :Base64編碼最常見於郵件與網頁傳輸中,比如QQ郵箱查看郵件原文就看到郵件原文中的 Content-Transfer-Encoding:base64,郵件最結尾便是base64編碼後的內容,比如:


Content-Type:text/html; charset="UTF-8"Content-Transfer-Encoding:base64X-SMTPAPI:List-Unsubscribe:<http://sctrack.sendcloud.net/track/unsubscribe.do?p=eyJ1c2VTk1%3D>5oKo5Zyo5Y2a5a6i5Zut5L2/55So5LqG5a+G56CB6YeN572u5Yqf6IO9LCDor7fpgJrov4fkuIvpnaLnmoTlnLDlnYDkv67mlLnlr4bnoIE6PGJyLz48YSBocmVmPSJodHRwczovL3Bhc3Nwb3J0LmNuYmxvZ3MuY29tL1Jlc2V0U******dvcmQuYXNweD9pZD1mOGIyMzUwMDUwNDM0YzAwYjU2MDZkOWMzZTY0MTZkYzIwMTcxMDIxMTgwMjU5ODgxMTkzODIyMjQ2*****+***HM6Ly9wYXNzcG9ydC5jbmJsb2dzLmNvbS9SZXNldFBhc3N3b3JkLmFzcHg/aWQ9ZjhiMjM1MDA1MDQzNGMwMGI1NjA2ZDljM2U2NDE2ZGMyMDE3MTAyMTE4MDI1OTg4MTE5MzgyMjI0NjE8L2E+PGJyLz4=

 

    郵件原文:

您在部落格園使用了密碼重設功能, 請通過下面的地址修改密碼:https://passport.cnblogs.com/ResetPassword.aspx?id=f8b23500******00b5606d9c3e6416dc201710211802598811938222461

 

   

    舉例2:網站 http://pythontutor.com/visualize.html#mode=edit,在網頁傳輸中就使用了base64編碼傳輸圖片資料:

此處網頁協議傳輸中就使用了base64來傳輸圖片資料,圖片資料原文:

GIF89a!,L;

 

0x02 編、解碼流程

Base64索引表:

數值 字元   數值 字元   數值 字元   數值 字元
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

這裡用兩個字母 'ab' 來分析base64 詳細的編碼流程:

文本 a b  
ASCII編碼 97 98  
二進位位 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0                       
索引 24 22 8  
Base64編碼 Y W I =

 

 

 

 

 

編碼後: YWI=

 

編碼流程:

  • base64 將兩個位元組的 'ab ' 看做是3個位元組的文本資料
  • 將 'a' 和 'b' 通過ASCII碼轉為10進位,為別是 97、98、0(補1個0)
  • 將10進位再轉換為2進位,分別對應:01100001、01100010、00000000
  • 將3個8位的2進位按每6位分割為4個6位的2進位,分割後:011000、010110、001000    (0010尾部補0湊足6位)
  • 將3個有效6位2進位轉為10進位,即base64編碼標的索引號,分別對應:24,22,8
  • 依次將3個10進位的索引號轉為對應的字元,便是編碼結果:Y、W、I
  • 但是只返回了3個位元組的編碼結果,所以補上去一個空位元組,最終用 '=' 填補上空位,最終組合成4位元組字元:YWI=

文本字元 --> 十進位 --> 二進位 --> 每6位切割 --> 切割後的值轉為10進位(索引值) --> 轉字元

 

ipython 下測試編碼字母 'a':

In [9]: ord('a')    Out[9]: 97In [10]: bin(97)   Out[10]: '0b1100001'In [11]: '{:>08b}'.format(97)   #轉2進位Out[11]: '01100001'In [12]: int('00011000',2)   #取前6位前面補0再轉位10進位,即是base64表索引值24對應字元: YOut[12]: 24

 

 

 

 

解碼流程:

編碼 --> 轉為base64索引值 --> 索引值轉6位的2進位 --> 每8位切割轉2進位 --> 轉10進位 --> 轉原文本

 

 

0x03 Python中Base64編碼與解碼

需要匯入python 的 base64 庫

在python 3 以上版本中需要將字元轉位bytes類型,再對其編碼或解碼 

 

In [1]: import base64In [2]: str = 'ab'In [3]: base64.b64encode(str.encode())Out[3]: b'YWI='In [4]: str2 = b'YWI='In [5]: base64.b64decode(str2.decode())Out[5]: b'ab'In [6]: base64.b64decode(str2.decode()).decode()Out[6]: 'ab'

 

 

 

總結:

藉助base64編碼又回顧了一下 ascii 、2進位、10進位、16進位,對電腦之間和網路資料轉送又增深了瞭解,對之後的網路編程課程部分有很大的協助。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.