1. 程式人生 > >base64編碼的理解

base64編碼的理解

最近學Python的時候遇到了編碼問題,順帶了解了一下base64編碼,首先閱讀了咱CSDN上的一篇文章Base64編碼原理,有所感悟,記錄下來以備日後檢視

首先,base64編碼是用64個字元來表示任意二進位制的資料的方法,有時候我們用記事本開啟.pdf,.exe, .png的字尾名的檔案時開啟是一堆亂碼。實際上這些二進位制檔案裡面包含了許多無法列印的字元,如果我們讓記事本能處理開啟這些檔案,就需要一種能處理二進位制檔案到字串的轉換的方法,就用到了base64編碼。

它很簡單,出現的原因也很單一:因為有些網路傳送渠道並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ASCII碼的控制字元就不能通過郵件傳送。這樣用途就受到了很大的限制,比如圖片二進位制流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協議的情況下,做一種擴充套件方案來支援二進位制檔案的傳送。把不可列印的字元也能用可列印字元來表示,問題就解決了。Base64編碼應運而生,Base64就是一種基於64個可列印字元來表示二進位制資料的表示方法。

首先,準備一個包含64個字元的陣列:['A', 'B', 'C', ... 'a','b', 'c', ... '0', '1', ... '+', '/'],換成圖示來表示就是這樣的

1字元=1個位元組=1byte=8個bit,所以任意一個上圖的64個字元中的都能用2的6次方以下的數來表示,換成二進位制來看,任意一個base64編碼的字元最多就是佔位6個bit,但是規定就是一個字元等於8個bit啊,現在你用一個base64就叫我換成6個bit了,那我多下來的倆bit放哪裡?那麼怎麼用6個有效bit來表示傳統字元的8個bit呢?8和6的最小公倍數是24,也就是說3個傳統位元組可以由4個Base64字元來表示,保證有效位數是一樣的,這樣就多了1/3的位元組數來彌補Base64只有6個有效bit的不足。你也可以說用兩個Base64字元也能表示一個傳統字元,但是採用最小公倍數的方案其實是最減少浪費的。結合下邊的圖比較容易理解。Man是三個字元,一共24個有效bit,只好用4個Base64字元來湊齊24個有效位。紅框表示的是對應的Base64,6個有效位轉化成相應的索引值再對應Base64字元表,查出"Man"對應的Base64字元是"TWFU"。說到這裡有個原則不知道你發現了沒有,要轉換成Base64的最小單位就是三個位元組,對一個字串來說每次都是三個位元組三個位元組的轉換,對應的是Base64的四個位元組。這個搞清楚了其實就差不多了。


加密解密的時候,對字元換成ASCII碼是第一步,可以看到,M換成ASCII碼後是77,然後用二進位制表示成01001101,a和n分別是01100001和01101110剩下的拼湊其實就是加減法了,很簡單,對應字元的二進位制碼全放到一起,然後從頭開始按6個bit是一個base64碼的規則來截,轉換成base64的字元後,最後剩下的如果不足6位,就用=號來補位。如果是6的倍數,那麼編碼結果就是base64的編碼集結果的一堆字元,如果不是6的倍數,就要在後面補位‘=’,湊夠6位為止,例如我們通常下載的迅雷連結,使用的就是對地址進行base64位加密,通常能在連結的最後面看到‘=’,就是這個原因了

說起Base64編碼可能有些奇怪,因為大多數的編碼都是由字元轉化成二進位制的過程,而從二進位制轉成字元的過程稱為解碼。而Base64的概念就恰好反了,由二進位制轉到字元稱為編碼,由字元到二進位制稱為解碼。


  Base64編碼主要用在傳輸、儲存、表示二進位制等領域,還可以用來加密,但是這種加密比較簡單,只是一眼看上去不知道什麼內容罷了,當然也可以對Base64的字元序列進行定製來進行加密。

由於=字元也可能出現在Base64編碼中,但=用在URL、Cookie裡面會造成歧義,所以,很多Base64編碼後會把=去掉:


# 標準Base64:
'abcd' -> 'YWJjZA=='
# 自動去掉=:
'abcd' -> 'YWJjZA'
去掉=後怎麼解碼呢?因為Base64是把3個位元組變為4個位元組,所以,Base64編碼的長度永遠是4的倍數,因此,需要加上=把Base64字串的長度變為4的倍數,就可以正常解碼了


本人建立了一個公眾號,裡面每天發一些教程進階知識,有的是本人總結所得,有的是轉載大神的文章,大家一起分享看。掃碼關注公眾號:


相關推薦

Base64編碼 理解

應該很清楚了吧?上面的三個位元組是原文,下面的四個位元組是轉換後的Base64編碼,其前兩位均為0。 轉換後,我們用一個碼錶來得到我們想要的字串(也就是最終的Base64編碼),這個表是這樣的:(摘自RFC2045)                             Table 1: The Base

從原理上理解Base64編碼

width sci 傳統 wid 文字 com base64編碼 限制 位數 開發者對Base64編碼肯定很熟悉,是否對它有很清晰的認識就不一定了。實際 上Base64已經簡單到不能再簡單了,如果對它的理解還是模棱兩可實在不應該。大概介紹一下Base64的相關內容,花幾分鐘

base64編碼理解

最近學Python的時候遇到了編碼問題,順帶了解了一下base64編碼,首先閱讀了咱CSDN上的一篇文章Base64編碼原理,有所感悟,記錄下來以備日後檢視 首先,base64編碼是用64個字元來表示

Base64編碼的原理理解

開發者對Base64編碼肯定很熟悉,是否對它有很清晰的認識就不一定了。實際上Base64已經簡單到不能再簡單了,如果對它的理解還是模稜兩可實在不應該。大概介紹一下Base64的相關內容,花幾分鐘時間就可以徹底理解它。文章下邊貼了一個Base64的編解碼器,方便閱讀文章的同

關於base64編碼的一些理解

就最根本的作用來說,把base64編碼解碼看做一個黑盒,那只有對byte[]型別的資料而言,是無失真的,也就是byte[]編碼後得到的,解碼後就是原來的byte[]。而本質上其他型別的資料string 還是file等,也都是轉byte[]才進行編碼。問題在於解碼的時候,由於

JS實現—Base64編碼解碼,帶16進制顯示

ech encode break 復制代碼 bre zab idt pts image 代碼如下: <!DOCTYPE html> <html> <head> <meta name="viewport" conte

java-base64編碼和解碼

exc util 分享 .org 數據 base64 [] 解碼 ble 一、反射/*** * encode by Base64 */ public static String encodeBase64(byte[]input)

圖片和base64編碼字符串 互相轉換,圖片和byte數組互相轉換

16進制 cnblogs exc 十六進制 tostring ati color int inpu 圖片和base64編碼字符串 互相轉換 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; imp

BASE64編碼的字符進行URL傳輸丟失特殊字符的問題

sca clas cape 特殊 空格 span ken data base64 因為BASE64的編碼裏含有“+”號等特殊字符,在url傳輸的時候會把+號編程空格,解決這個問題的方法:   請求時把BASE64編碼進行url的編碼再進行傳輸   接收時把BASE64編碼進

JAVA實現Base64編碼的三種方式

ack ons static nts bstr clas [] ram trace 摘要: Javabase64編碼的三種方式 有如下三種方式: 方式一:commons-codec.jar Java代碼 1. String base64String="whuang12

文件上傳三:base64編碼上傳

說了 json datetime byte 調試 handle png mage hang 介紹三種上傳方式: 文件上傳一:偽刷新上傳 文件上傳二:FormData上傳 文件上傳三:base64編碼上傳 Flash的方式也玩過,不喜歡不拿來說了。 優點: 1.瀏覽器可以

關於base64編碼的原理及實現

一個 replace 編碼範圍 func nco 都是 style bit 如果 我們的圖片大部分都是可以轉換成base64編碼的data:image。 這個在將canvas保存為img的時候尤其有用。雖然除ie外,大部分現代瀏覽器都已經支持原生的基於base64的enco

C#中將字符串轉成 Base64 編碼 (加密--解密)

odin .html ctype cte bytes webp ase nba bsp 1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Base64.aspx.cs" Inherits="Base

Base64編碼字符串時數據量明顯變大

ase byte[] oba convert 大小 rst 拆分 string byte 那就是當把byte[]通過Convert.ToBase64String轉換成Base64編碼字符串時數據量明顯變大 Base64編碼的思想是是采用64個基本的ASCII碼字符對數據進行

C#中圖片轉換為Base64編碼Base64編碼轉換為圖片

byte[] agen oms ase gef urn for app raw #region 圖片轉為base64編碼的字符串 public string ImgToBase64String(string Imagefilename) {

BASE64編碼的圖片在網頁中的顯示問題的解決

base64 問題 圖片 spi www. html nbsp base64編碼 href BASE64編碼的圖片在網頁中的顯示問題的解決 關於圖片的Base64編碼,你了解嗎? BASE64編碼的圖片在網頁中的顯示問題的解決

jmeter URL base64編碼遇到的問題

intern enc mis except base64 misc for coder exception 在使用jmeter做接口測試的過程中,使用base64轉換完之後的字符串加入到url中,總是 Java.net.MalformedURLException:Illeg

用javascript實現base64編碼

應用 ges 標準 asd 富文本 隨著 不同 none fail 前面的話   base-64作為常見的編碼函數,在基本認證、摘要認證以及一些HTTP擴展中得到了大量應用。在前端領域,也常常把圖片轉換為base-64編碼在網絡中傳輸。本文將詳細介紹base64的原理及用j

java加密基礎(一) —— BASE64編碼

test 分享 非對稱 學習 int ava 學習過程 public encode   工作之後第一次接觸到java加密機制,當時需求是使用RSA做數字簽名。當時看到之後一臉懵逼,就查了各種資料。   對於學習過程中我走了不少彎路,主要是因為不知道先看什麽在看什麽。下面說一

Android數據加密之Base64編碼算法

進制數 方案 二進制 strong ack 字符串 ora 如果 方法 Android數據加密之Base64編碼算法前言: 前面學習總結了平時開發中遇見的各種數據加密方式,最終都會對加密後的二進制數據進行Base64編碼,起到一種二次加密的效果,其實呢Base64