日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简析多种编码方式(Hex, Base64, UTF-8)

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简析多种编码方式(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。