简析多种编码方式(Hex, Base64, UTF-8)
簡析多種編碼方式(Hex, Base64, UTF-8)
首先計算機只認得二進制,0和1,所以我們現在看到的字都是經過二進制數據編碼后的;計算機能針對0和1的組合做很多事情,這些規則都是人定義的;然后有了字節的概念,8比特一個字節,如01011100就是一個字節;
人定義好計算機的0和1的數據結構做事的時候,如果每個人都用不同的數據結構,不同的定義,就會使得人和人之間讓計算機做的事無法統一,也導致無法通訊,所以要一起共同定義一套大家都認同的規則,其中ASCii碼就是最初始的交換碼,用做記錄信息、交互信息的;
相同的字節串不同的編碼就會有不同的展示,只有正確的編碼才能表達出字符串本身要記載的信息,而信息是面向人的,只有人能識別,才叫信息,只是偶爾被計算機理解;
?
字節、字符與字符串:
字節是8比特位構成,上傳已經說了;
字符是用字節構成的,但多少字節,怎么構成我們認識的唯一的字符?這個由編碼格式決定,也就是Unicode、GBK,(為啥要用字節?,因為歷史覺得8比特很牛逼啊)
字符串是字符的序列,各種計算機語言不同表示,如Redis就和C的字符串不一樣,C是以 ‘\0’ 結尾;我們說的對字符的編碼,而不是字符串;
?
Hex用字符串形式看二進制代碼:
首先,二進制文件通常不易于人看,因為人會看眼花,所以必須轉為其他進制,16進制是最好的,剛好2字符表示一個字節
Hex編碼是以4比特作為一個單位編碼,用4是因為計算機進位是2的倍數,而為了能把比特串分割開來,最適中就是取16進制;所以Hex編碼就是16進制編碼;用于人類比用比特更直觀簡介的方式看待比特串(馬上反應過來比特串),當然取更多位不適合人口算;
然后我們就有了WinHex這個工具的命名;用它修復二進制文件很不錯,前提你對該文件二進制構表(一般是具有協議去解析二進制的,我稱之為構表協議吧)很熟;
Base64是面向網絡的,其實性質也是這樣;
?
Unicode、GBK都是字符串編碼:
看到知乎一個alipay的說啥編碼和編碼格式不同,gbk是unicode的編碼格式,簡直笑死人;
字符是獨一無二的,人類符號系統抽象的產物,世界唯一,全世界的字符構成字符集,字符也是在演進的;而Unicode和GBK等都是字符的一種編碼;也就是一個二進制比特串(數字)和字符的映射表;
?
Java內部是Unicode默認,以及其面向字符、面向字節:
對于一個抽象字符,在Java中的二進制表示當然需要編碼,用的就是Unicode,如果源文件存儲并非Unicode怎么辦呢?當然需要轉換,因此Java很多面向字符流的I/O其實都是默認有轉換規則存在;
這里提下I/O都分面向字節和字符,其實面向字節就是不管編碼,而面向字符是帶編碼轉換,是的一個抽象字符串如 “飯” 是在哪種編碼格式都表示 “飯”,因此面向字符I/O指定編碼格式很重要,一般不指定采用默認,如win操作系統默認GBK,而linux默認UTF-8;
?
UTF-8和Unicode是哈夫曼編碼:
自己去查一下吧,是哈夫曼編碼轉換的
? ?Unicode
UTF-8
? ?待補
?
Hex編碼的編碼原理:
* Hex編碼的原理就是將原來8位的二進制字節打斷,分成兩個4位的,并且在前面加上4個零,
* 進行補位這樣一個8位二進制字節就變成了2個8位的二進制字節,在將新得到的2個二進制字符進行16位進制轉換
* 得到的新的16位字符串就是Hex的值,所以 二進制的[72, 69, 88]??《hex》 484558是相等的。
* [72, 69, 88]byte數組的二進制=?01001000? ?01000101? ?01011000?
* 二進制=?01001000? ?01000101? ?01011000? 進行hex的打斷操作 ?0100 1000? ?0100 0101? ?0101 1000
* 在加上前面的4個零得到一個新的6個8位二進制 = 0000?0100 00001000 ?0000?0100 00000101? 0000?0101 00001000
* 新的6個8位二進制 進行16進制轉換 0000?0100 00001000 ?0000?0100 00000101? 0000?0101 00001000 = 484558
* 總結所以說Hex編碼后的二進制長度變為了原來的2倍,所以字節長度增加了一倍。
?
Hex的編碼過程
字符串: HEX ASCII碼: [72,69,88] 二進制碼: ?01001000? ?01000101? ?01011000? 重新分組: 0100 1000 0100 0101 0101 1000 高位補零后的二進制碼: 00000100 00001000 00000100 00000101 00000101 00001000 十六進制碼: 4 8 4 5 5 8 Hex碼: 484558?
Java 代碼實現
package com.gl.test;import org.apache.commons.codec.binary.Hex;import java.util.Arrays;public class TestHex {public static void main(String[] args) {//一個字符串String hex = "HEX";//獲取字符串的byte數組byte[] buf = hex.getBytes();//輸出byte數組System.out.println(Arrays.toString(buf));//轉換成Hex輸出System.out.println(Hex.encodeHexString(buf));} }maven 依賴
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency>?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的简析多种编码方式(Hex, Base64, UTF-8)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python-又到了抢票的季节(带验证码
- 下一篇: 开源XDesigner ORM 框架设计