Hex编码与Base64编码
生活随笔
收集整理的這篇文章主要介紹了
Hex编码与Base64编码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Hex編碼與Base64編碼
- 什么是明文
- 什么是編碼
- Hex編碼
- Hex編碼實現細節
- 自定義Hex編碼
- Base64編碼
- Base64編碼實現細節
- 自定義Base64編碼
什么是明文
介紹什么是編碼之前,首先了解下什么是明文,表示其本身意思的,他就是明文
比如你看到"E6988E",如果是明文他就代表他自己,也就是當他表示"E6988E"時, 但是他如果是Hex編碼后的,那他就代表"明"什么是編碼
由于計算機存儲的都是二進制數,得通過編碼轉換成人能認識得東西,中文就是UTF8編碼或者Unicode編碼后的結果有些網站不想讓你看到他發送至服務端的數據,會通過加密算法對數據進行加密(對字節進行位運算),加密完把字節toString會導致亂碼(位運算完的字節大多數無法在UTF8碼表或者Unicode編碼中找到可見字符),所以有了Hex編碼和Base64編碼Hex編碼
Hex編碼是一種用16個字符(0123456789ABCDEF)表示任意二進制數據的方法,是一種編碼,并非加密字符編碼,“明"通過Hex編碼后是"E6988E”
Hex編碼實現細節
//查看com.sun.org.apache.xerces.internal.impl.dv.util下HexBin類可知static public String encode(byte[] binaryData) {if (binaryData == null)return null;int lengthData = binaryData.length;//由此可見,Hex編碼的字節長度是原字節長度的2倍int lengthEncode = lengthData * 2;char[] encodedData = new char[lengthEncode];int temp;for (int i = 0; i < lengthData; i++) {temp = binaryData[i];//這里是有符號數轉無符號數if (temp < 0)temp += 256;//lookUpHexAlphabet就是碼表//取當前字節的高四位encodedData[i*2] = lookUpHexAlphabet[temp >> 4];//取當前字節的低四位encodedData[i*2+1] = lookUpHexAlphabet[temp & 0xf];}return new String(encodedData);} 由此可知,Hex編碼就是分別獲取前字節的高四位和低四位轉換成十進制數,當作索引去碼表里面獲取對應的字符拼接返回 二進制數00000000-00001111代表的范圍是0-15,和碼表里面的字符一一對應 PS:8位為一個字節,取出來四位后會在前面補零,然后轉10進制自定義Hex編碼
了解清楚Hex編碼的實現機制后,就可以開始自定義Hex編碼了,能看到這里把HexBin的方法扣過來,編碼出來的結果是一樣的,改一下碼表就能實現自定義Hex編碼了
當我們把碼表換了后,編碼出來的數據與之前完全不一樣了,因為相同的索引對應的字符已經不是之前那個了,如果需要解碼成功,也需要更換解碼的碼表,否則會亂碼
Base64編碼
Base64是一種用64個字符表示任意二進制數據的方法,是一種編碼,并非加密字符編碼
由 A-Z a-z 0-9 + / 和補充字符 “=” 組成,Base64編碼后的字符數是4的倍數(不足會補"=")
Base64編碼實現細節
具體和Hex編碼類似
Hex編碼是4個比特轉換成一個新的字符串,Base64是6個比特轉換成一個新的字符串,而6個比特(0011 1111)最能表示的十進制數為63,加上0為64,跟進源碼可以看出,Base64有倆碼表
因為"+“和”/"出現在url中的話,后端接收會出問題
自定義Base64編碼
和自定義Hex編碼同理,修改碼表即可,對應解碼也需要使用修改后的碼表
總結
以上是生活随笔為你收集整理的Hex编码与Base64编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dya3:Python的开发工具
- 下一篇: 基于Tor网络的HTTP代理搭建过程