ASCII
美國資訊交換標準代碼 ( American Standard Code for Information Interchange, ASCII )
在計算機中,所有的資料在存盤和運算時都要使用二進制數表示(因為計算機用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個字母(包括大寫)、以及0、1、2等數字還有一些常用的符號(例如*、#、@等)在計算機中存盤時也要使用二進制數來表示,而具體用哪個數字表示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通訊而不造成混亂,那么大家就必須使用相同的編碼規則,于是美國有關的標準化組織就出臺了所謂的ASCII編碼,統一規定了上述常用符號用哪個二進制數來表示,
美國標準資訊交換代碼是由美國國家標準學會(American National Standard Institute , ANSI )制定的,標準的單位元組字符編碼方案,用于基于文本的資料,起始于50年代后期,在1967年定案,它最初是美國國家標準,供不同計算機在相互通信時用作共同遵守的西文字符編碼標準,它已被國際標準化組織(International Organization for Standardization, ISO)定為國際標準,稱為ISO 646標準,適用于所有拉丁文字字母,
ASCII 碼使用指定的 7 位或 8 位二進制陣列合來表示 128 或 256 種可能的字符,標準 ASCII 碼也叫基礎ASCII碼,使用 7 位二進制數來表示所有的大寫和小寫字母,數字 0 到 9、標點符號, 以及在美式英語中使用的特殊控制字符,其中:
0~31及127(共33個)是控制字符或通訊專用字符(其余為可顯示字符),如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(洗掉)、BS(退格)、BEL(振鈴)等;通訊專用字符:SOH(文頭)、EOT(文尾)、ACK(確認)等;ASCII值為 8、9、10 和 13 分別轉換為退格、制表、換行和回車字符,它們并沒有特定的圖形顯示,但會依不同的應用程式,而對文本顯示有不同的影響,
32~126(共95個)是字符(32sp是空格),其中48~57為0到9十個阿拉伯數字;
65~90為26個大寫英文字母,97~122號為26個小寫英文字母,其余為一些標點符號、運算子號等,
同時還要注意,在標準ASCII中,其最高位(b7)用作奇偶校驗位,所謂奇偶校驗,是指在代碼傳送程序中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種,
-
奇校驗規定:一個位元組中八個二進制位數中1的個數必須是奇數,若非奇數,則在最高位b7添1;
- 原始碼流+校驗位 總共有奇數個1
-
偶校驗規定:一個位元組中八個二進制位數中1的個數必須是偶數,若非偶數,則在最高位b7添1,
- 原始碼流+校驗位 總共有偶數個1

MIME

**網路傳輸只能傳輸可列印字符(32127),**在網路上交換資料時,比如說從A地傳到B地,往往要經過多個路由設備,由于不同的設備對字符的處理方式有一些不同,這樣那些**不可見字符就有可能被處理錯誤**(控制字符,通訊專用字符,128255),這是不利于傳輸的,所以就先把資料先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了,
通用互聯網郵件擴充MIME,增加了郵件的主體結構,定義了非ASCII碼的編碼傳輸規則,這就是Base64,
BASE64
6bit(原8bit)一個位元組,不足的位數用0補齊,兩個0用一個=表示,
采用64個基本的ASCII碼字符對資料進行重新編碼,
- 將需要編碼的資料拆分成位元組陣列,以3個位元組為一組,按順序排列24位資料,再把這24位資料分成4組,即每組6位;
- 再在每組的的最高位前補兩個0湊足一個位元組,這樣就把一個3位元組為一組的資料重新編碼成了4個位元組;
- 當所要編碼的資料的位元組數不是3的整倍數,也就是說在分組時最后一組不夠3個位元組,這時在最后一組填充1到2個0位元組,并在最后編碼完成后在結尾添加1到2個=號,

為什么不直接傳二進制
- 某些場合并不能傳輸或者儲存二進制流,如果一個傳輸協議是基于ASCII文本的,那么它就不能傳輸二進制流,要將二進制流傳輸就得編碼,常見的 http 協議的 url 就是純文本的,不能直接放二進制流,
- 大多數現代語言的 String 型別,都不能直接儲存二進制流,但可以儲存BASE64編碼的字串,如果你希望用 String 型別操作一切資料,那就沒法直接用二進制流,
- 就是某些協議會對二進制流中的特定字符進行特殊處理(比如ASCII的0~32編碼的字符在某些傳輸介質中,是會被當作特殊含義處理的),這種時候就需要通過編碼來避開這些特定字符了,(前面MIME的例子)
編碼例子
- 第一種:待編碼的二進制只有24位,此時剛好能分成4組,編碼結果就是4個字符,沒有=號,如you有24位二進制,結果就是eW91,

- 第二種:待編碼的二進制只有16位,那么編碼的結果就是3個字符跟上一個=號,如Ma:
Ma的二進制:01001101 01100001
分組結果:010011 010110 0001
根據??RFC-4648??的規范,對于這種情況,將在最后用0補齊6位,得到:010011 010110 000100
對應Base64的編碼就是TWE,為了能在解碼時能識別出最后有補齊的兩個0,以便去掉,要跟上=作記號,所以Ma最終的Base64編碼就是TWE=, - 第三種:待編碼的二進制只有8位,Base64編碼結果應該是兩個字符,跟上兩個=號,如M:
M的二進制:01001101
分組結果:010011 01
根據??RFC-4648??的規范,對于這種情況,將在最后用0補齊6位,得到:010011 010000
對應Base64的編碼就是TQ,為了能在解碼時能識別出最后有補齊的4個0,以便去掉,要跟上兩個=作記號,所以M最終的Base64編碼就是TQ==
處理中文
Base64 僅可對 ASCII 字符進行編碼,如果是中文字符等非ASCII碼,就需要先將中文字符轉換為ASCII字符后,再進行編碼才行,
資料體積
Base64編碼的資料體積通常比原資料的體積大三分之一,
應用
-
簡單加密,(不確保安全性)
-
URL編碼(改良的BASE64),(具體編碼方式由瀏覽器決定)
- 我的JSP&Servlet之旅、01 HTTP基礎、模型架構 - 小能日記
-
后端把資料庫中檔案資料回傳前端前將資料轉換為Base64編碼后的字串,
-
前端頁面針對圖片處理,Data URL,可以直接減少請求數,將其內嵌在img標簽或者css樣式中,
- data:[<mime type>][;base64],<data>
<img src="data:image/svg+xml;base64,MTE0NTE0.......">.buttonimg{ background: url(data:image/svg+xml;base64,MTE0NTE0......);}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509524.html
標籤:其他
