HEX编码、Base64编码
文章目錄
- 摘要
- HEX編碼
- Base64編碼
- 總結
摘要
本文將講述HEX 和Base64,編碼的規則。
HEX編碼
hex編碼也稱之為Base16 編碼
就是把一個字節,用十六進制來表示, 表示的結果得是字符形式的。 說過程大家就會更加容易理解
比如說字符的 ‘a’,在計算機底層存儲的是 0110 0001 ,對應的16進制就是61 ,它對應的字符 是'61'
也就是說 ‘a’ 經過HEX編碼轉化成了 '61' ,從計算存儲二進制的角度是 從0110 0001經過HEX編碼成了 0011011000110001,占用的存儲擴大了一倍。
其他任意二進制數據(字節為單位)都可以轉化。
代碼演示:
byte[] src = "a".getBytes(StandardCharsets.UTF_8); byte[] encoded = Hex.encode(src);System.out.printf("字符串'%s'編碼后的字符結果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8)); System.out.printf("原長度:%d,編碼后的長度:%d, 編碼后是原來的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);輸出結果為61
字符串'a'編碼后的字符結果:'61' 原長度:1,編碼后的長度:2, 編碼后是原來的2.00Base64編碼
Base64的算法規則
-
把數據按照字節分為三個字節一組,也就是24bit,如果最后存在不夠三個字節為一組,也就是不夠24bit的話,就使用0補位
- 由于 編碼的時候以6bit為一個編碼的單位,所以缺一個字節的話就是24-8=16bit,也就是補2bit的0,那么就得補成18bit,構成整數編碼單位。
- 缺兩個字節的話就是24-16=8bit,那么就得補成12bit,也就是補4bit的0,構成整數編碼單位。
-
每一組按照 以6bit為單位按照下面表格進行編碼。如果最后一組只有三個編碼單位的長度,那么就在編碼的結果最后加上=,。如果最后一組只有兩個編碼單位的長度,那么就在編碼的結果最后加上==
?
IndexBinaryCharIndexBinaryCharIndexBinaryCharIndexBinaryChar 0 000000 A 16 010000 Q 32 100000 g 48 110000 w 1 000001 B 17 010001 R 33 100001 h 49 110001 x 2 000010 C 18 010010 S 34 100010 i 50 110010 y 3 000011 D 19 010011 T 35 100011 j 51 110011 z 4 000100 E 20 010100 U 36 100100 k 52 110100 0 5 000101 F 21 010101 V 37 100101 l 53 110101 1 6 000110 G 22 010110 W 38 100110 m 54 110110 2 7 000111 H 23 010111 X 39 100111 n 55 110111 3 8 001000 I 24 011000 Y 40 101000 o 56 111000 4 9 001001 J 25 011001 Z 41 101001 p 57 111001 5 10 001010 K 26 011010 a 42 101010 q 58 111010 6 11 001011 L 27 011011 b 43 101011 r 59 111011 7 12 001100 M 28 011100 c 44 101100 s 60 111100 8 13 001101 N 29 011101 d 45 101101 t 61 111101 9 14 001110 O 30 011110 e 46 101110 u 62 111110 + 15 001111 P 31 011111 f 47 101111 v 63 111111 / Padding =
舉例說明
- 最后一組三個字節,不用補位
? 'abc'字符串 底層的二進制為 011000010110001001100011,這是24個bit為一組,以6bit分為四部分為 011000 010110 001001 100011 編碼成對應上表的字符 ’ YWJj' 。
byte[] src = "abc".getBytes(StandardCharsets.UTF_8); byte[] encoded = Base64.encode(src);System.out.printf("字符串'%s'編碼后的字符結果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8)); System.out.printf("原長度:%d,編碼后的長度:%d, 編碼后是原來的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length); 字符串'abc'編碼后的字符結果:'YWJj' 原長度:3,編碼后的長度:4, 編碼后是原來的1.33-
最后一組只有兩個字節,補2bit 0
? 'ab'字符串 底層的二進制為 0110000101100010,補位成 011000010110001000,以6bit分為三部分為 011000 010110 001000 編碼成對應上表的字符 ’ YWI' ,因為比一般的少一個編碼單位,所以在后面加上一個=字符,最終的結果就是 ’ YWI=' 。
-
最后一組只有一個字節 補4bit0
? 'a'字符串 底層的二進制為 01100001,補位成 011000010000這是24個bit為一組,以6bit分為四部分為 011000 010000 編碼成對應上表的字符 ’ YQ' ,因為比一般的少兩個編碼單位,所以后面加上兩個=字符,最終的結果就是 ’ YQ==' 。
由于在編碼的過程中只有最后一組才有可能存在補位情況,所以我們可以認為 使用base64編碼后數據的體積是原來的1.33倍
總結
? HEX編碼的特點是:解碼編碼速度快但是體積變大了一倍;Base64編碼的特點: 體積小,但是由于算法相對復雜所以解碼編碼速度比較慢。
? 由于兩種編碼規則可以是任何二進制的數據編碼成字符集可以翻譯二進制數據,這樣的話我們就輕而易舉的把二進制數據打印顯示出來。便于我們查看二進制數據。有些網絡協議傳輸只支持文本流的二進制數據傳輸,所以這時候就可以使用這兩種編碼。
總結
以上是生活随笔為你收集整理的HEX编码、Base64编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab驻波仿真
- 下一篇: 【大学物理】期末复习原题+答案(超实用)