Python Base64 編碼

来源:http://www.cnblogs.com/i-honey/archive/2017/10/22/7711588.html
-Advertisement-
Play Games

[摘要] 對 Base64 編碼的簡介,常用場景舉例,編、解碼流程,以及如何在 Python 中使用 Base64編碼與解碼 ...


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:base64
X-SMTPAPI:
List-Unsubscribe:<http://sctrack.sendcloud.net/track/unsubscribe.do?p=eyJ1c2VTk1%3D>

5oKo5Zyo5Y2a5a6i5Zut5L2/55So5LqG5a+G56CB6YeN572u5Yqf6IO9LCDor7fpgJrov4fkuIvp
naLnmoTlnLDlnYDkv67mlLnlr4bnoIE6PGJyLz48YSBocmVmPSJodHRwczovL3Bhc3Nwb3J0LmNu
YmxvZ3MuY29tL1Jlc2V0U******dvcmQuYXNweD9pZD1mOGIyMzUwMDUwNDM0YzAwYjU2MDZkOWMz
ZTY0MTZkYzIwMTcxMDIxMTgwMjU5ODgxMTkzODIyMjQ2*****+***HM6Ly9wYXNzcG9ydC5jbmJs
b2dzLmNvbS9SZXNldFBhc3N3b3JkLmFzcHg/aWQ9ZjhiMjM1MDA1MDQzNGMwMGI1NjA2ZDljM2U2
NDE2ZGMyMDE3MTAyMTE4MDI1OTg4MTE5MzgyMjI0NjE8L2E+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]: 97

In [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對應字元: Y
Out[12]: 24

 

 

 

 

解碼流程:

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

 

 

0x03 Python中Base64編碼與解碼

需要導入python 的 base64 庫

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

 

In [1]: import base64

In [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進位,對電腦之間和網路數據傳輸又增深了瞭解,對之後的網路編程課程部分有很大的幫助。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Twisted是用Python實現的基於事件驅動的網路引擎框架,Twisted支持許多常見的傳輸及應用層協議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一樣,Twisted也具有“內置電池”(batteries-included)的特點。Twi ...
  • 關於目後佐道IT教育 http://www.cnblogs.com/itpua/p/7710917.html 目後佐道IT教育的師資團隊 http://www.cnblogs.com/itpua/p/7712077.html 目後佐道IT教育正在打架報名中,歡迎高中生、大學生前來學習編程技術,招生面 ...
  • 關於目後佐道IT教育 http://www.cnblogs.com/itpua/p/7710917.html 高端技術顧問 1. leepoor 擁有12年的Web開發和架構經驗,在阿裡巴巴擔任高級架構師,參與阿裡巴巴基礎技術平臺開發和www.alibaba.com架構設計。擅長大型網站技術架構,工 ...
  • 題目描述 現有n個正整數,n≤10000,要求出這n個正整數中的第k個最小整數(相同大小的整數只計算一次),k≤1000,正整數均小於30000。 輸入輸出格式 輸入格式: 第一行為n和k; 第二行開始為n個正整數的值,整數間用空格隔開。 輸出格式: 第k個最小整數的值;若無解,則輸出“NO RES ...
  • 1、簡介 從接觸yii框架到現在已經快有兩個月了,但是自己對yii框架的瞭解程度並不是很深,並沒有系統地去學習,僅僅只是在做項目的時候遇到不懂得知識才去翻手冊。 在上一個項目中因為需要將關聯的表的欄位顯示出來並且帶搜索排序功能,這個在之前並沒有接觸過,因此在手冊中查找了相關的資料把這個需求寫出來了, ...
  • 題目描述 一組數,分別表示地平線的高度變化。高度值為整數,相鄰高度用直線連接。找出並統計有多少個可能積水的低窪地? 如圖:地高變化為 0 1 0 2 1 2 0 0 2 0 輸入輸出格式 輸入格式: 兩行,第一行n,表示有n個數。第2行連續n個數表示地平線高度變化的數據,保證首尾為0。(3<=n<= ...
  • InputStream is = null;try { is = new FileInputStream(textPath); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 512); / ...
  • 1.功能簡介 此程式模擬員工信息資料庫操作,按照語法輸入指令即能實現員工信息的增、刪、改、查功能。 2.實現方法 架構: 本程式採用python語言編寫,關鍵在於指令的解析和執行:其中指令解析主要運用了正則表達式來高效匹配有效信息;指令執行通過一個commd_exe主執行函數和增、刪、改、查4個子執 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...