base64編碼

来源:http://www.cnblogs.com/kevin2chen/archive/2017/05/26/6910621.html
-Advertisement-
Play Games

Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 re ...


Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation. 

Base64是一種用64個可列印字元來表示任意二進位數據的方法,不能用於加密。

為什麼使用Base64格式編碼?

在只支持純文本的協議中需要保存非字元類數據(url(data:image/png;base64,…)),或在只支持ASCII字元的系統中保存非ASCII字元的數據時,可以將數據的二進位形式編碼成Base64形式保存。

ASCII碼的128~255之間的值是不可見字元,在純文本協議的傳輸過程中可能會被錯誤當作控制字元處理引起傳輸失敗。全部編碼成可見字元,降低出錯的可能性。

Base64的編碼轉換方式

  1. 將每三個位元組分為一組,一共是24 bit。
  2. 將這24個二進位位分為四組,每個組有6個二進位位。
  3. 在每組前面固定先加00,這樣每組還是8 bit,有效位是每組的低6位。即原來3個位元組擴展成32個二進位位四位元組。(每組最高值為63)
  4. 然後查表得到編碼後的字元串。Base64將三個位元組轉化成四個位元組,編碼後的文本會比原文多三分之一。

Base64編碼表

碼值

字元

 

 

碼值

字元

 

碼值

字元

 

碼值

字元

0

A

 

26

a

52

0

62

+

 

63

/

 編碼實例:

source ASCII (if <128) M a n
source octets 77 (0x4d) 97 (0x61) 110 (0x6e)
Bit pattern 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
Index 19 22 5 46
Base64-encoded T W F u
encoded octets 84 (0x54) 87 (0x57) 70 (0x46) 117 (0x75)

如果要編碼的二進位數據不是3的倍數,分組後後會剩下1個或2個位元組。Base64用\x00在末尾補足一組後,再在編碼的末尾加上1個或2個=號,表示為了湊成一組補了多少位元組。 

多一個位元組時:先在該位元組之後添加2個\x00位元組組成一組,再按照上面的規則轉換成base64碼的4位元組。每個位元組前面2位固定為0,最後在Base64編碼的末尾補上兩個"="號,表示補了2個位元組。

比如,"M"這個字母是一個位元組,可以轉化為二組00010011、00010000,對應的Base64值分別為T、Q,再補上二個"="號,因此"M"的Base64編碼就是TQ==。

Text content M  添加\x00補足一組  添加\x00補足一組
ASCII 77 (0x4d) 0 (0x00) 0 (0x00)
Bit pattern 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Index 19 16 0 0
Base64-encoded T Q = =

多二個位元組時:先在這兩個位元組之後添加1個\x00組成一組,再按照上面的規則轉換成base64的4位元組,最後在末尾補上一個"="號。

比如,"Ma"這個字元串是兩個位元組,可以轉化成三組00010011、00010110、00000100以後,對應Base64值分別為T、W、E,再補上一個"="號,因此"Ma"的Base64編碼就是TWE=。 

Text content M a  
ASCII 77 (0x4d) 97 (0x61) 0 (0x00)
Bit pattern 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0
Index 19 22 4 0
Base64-encoded T W E =

中文用Base64編碼

先要獲得二進位數據,再根據上述規則轉換。不同的中文編碼方式對應的二進位不同,所有如果不統一容易出現亂碼。

"嚴"的utf-8編碼為3位元組E4B8A5,寫成二進位就是三位元組的"11100100 10111000 10100101",然後轉換成Base64值就是5Lil。


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

-Advertisement-
Play Games
更多相關文章
  • GetConsoleTitle函數 來源:https://msdn.microsoft.com/en us/library/windows/desktop/ms683174(v=vs.85).aspx 作用 獲取當前控制台視窗的標題 語法 參數 lpConsoleTitle 用於保存控制台標題。若設 ...
  • std::string s1 = R"(Name="Hello World ... ")"; std::string s2 = R"-(Name="(Hello World ... )")-"; std::string s3 = R"-(Name="Hello World ... ")-"; std... ...
  • 在java里, 我們可以使用Executors.newFixedThreadPool 來創建線程池, 然後就可以不停的創建新任務,並用線程池來執行了。 在提交任務時,如果線程池已經被占滿,任務會進到一個隊列里等待執行。 這種機制在一些特定情況下會有些問題。今天我就遇到一種情況:創建線程比線程執行的速 ...
  • hljs.initHighlightingOnLoad(); SetConsoleScreenBufferSize函數 來源:https://msdn.microsoft.com/en us/library/windows/desktop/ms686044(v=vs.85).aspx 作用 指定控制 ...
  • 一些事情久久不能釋懷,於是最近學習了下最短路的演算法,希望我能變得輕鬆些。 dijkstra是一種單源最短路演算法。在沒有負權值的圖上,vi..vj..vk是vi到vk最短路的話,一定要走vi到vj的最短路。所以每次取出到起點距離最小的點,從該點出發更新鄰接的點的距離,如果更新成功則把新點加入prior ...
  • 也許很多朋友在學習NIO的時候都會感覺有點吃力,對裡面的很多概念都感覺不是那麼明朗。在進入Java NIO編程之前,我們今天先來討論一些比較基礎的知識:I/O模型。下麵本文先從同步和非同步的概念 說起,然後接著闡述了阻塞和非阻塞的區別,接著介紹了阻塞IO和非阻塞IO的區別,然後介紹了同步IO和非同步IO... ...
  • 在實際的應用場景中,兩個實體之間不只是簡單的一對一關係,還會出現多對多關係,同時還有可能會出現多對多關係還附帶有其他欄位的情況。本文通過幾個例子,對錶間多對多關係的實體類代碼表示方法進行描述。這種設計方法,並不只是在使用 ORM 框架時需要,事實上,它是 POCO 及簡單 Java 類(POJO)的... ...
  • 圓角邊框以及陰影製作卡片式圖片 圓角邊框 border-radius 卡片使用陰影 box-shadow 利用陰影給圖片底部創造一個長方形 內部的元素會直接覆蓋整個陰影 HTML 部分 CSS 部分 圖片展示 此文到此結束 此文參考鏈接 http://www.w3school.com.cn/cssr ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...