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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HEX编码、Base64编码

發(fā)布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HEX编码、Base64编码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 摘要
    • HEX編碼
    • Base64編碼
    • 總結(jié)

摘要

本文將講述HEX 和Base64,編碼的規(guī)則。

HEX編碼

hex編碼也稱之為Base16 編碼

就是把一個字節(jié),用十六進(jìn)制來表示, 表示的結(jié)果得是字符形式的。 說過程大家就會更加容易理解

比如說字符的 ‘a(chǎn)’,在計算機底層存儲的是 0110 0001 ,對應(yīng)的16進(jìn)制就是61 ,它對應(yīng)的字符 是'61'

也就是說 ‘a(chǎn)’ 經(jīng)過HEX編碼轉(zhuǎn)化成了 '61' ,從計算存儲二進(jìn)制的角度是 從0110 0001經(jīng)過HEX編碼成了 0011011000110001,占用的存儲擴大了一倍。

其他任意二進(jìn)制數(shù)據(jù)(字節(jié)為單位)都可以轉(zhuǎn)化。

代碼演示:

byte[] src = "a".getBytes(StandardCharsets.UTF_8); byte[] encoded = Hex.encode(src);System.out.printf("字符串'%s'編碼后的字符結(jié)果:'%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);

輸出結(jié)果為61

字符串'a'編碼后的字符結(jié)果:'61' 原長度:1,編碼后的長度:2, 編碼后是原來的2.00

Base64編碼

Base64的算法規(guī)則

  • 把數(shù)據(jù)按照字節(jié)分為三個字節(jié)一組,也就是24bit,如果最后存在不夠三個字節(jié)為一組,也就是不夠24bit的話,就使用0補位

    • 由于 編碼的時候以6bit為一個編碼的單位,所以缺一個字節(jié)的話就是24-8=16bit,也就是補2bit的0,那么就得補成18bit,構(gòu)成整數(shù)編碼單位。
    • 缺兩個字節(jié)的話就是24-16=8bit,那么就得補成12bit,也就是補4bit的0,構(gòu)成整數(shù)編碼單位。
  • 每一組按照 以6bit為單位按照下面表格進(jìn)行編碼。如果最后一組只有三個編碼單位的長度,那么就在編碼的結(jié)果最后加上=,。如果最后一組只有兩個編碼單位的長度,那么就在編碼的結(jié)果最后加上==

    ?

    IndexBinaryCharIndexBinaryCharIndexBinaryCharIndexBinaryChar
    0000000A16010000Q32100000g48110000w
    1000001B17010001R33100001h49110001x
    2000010C18010010S34100010i50110010y
    3000011D19010011T35100011j51110011z
    4000100E20010100U36100100k521101000
    5000101F21010101V37100101l531101011
    6000110G22010110W38100110m541101102
    7000111H23010111X39100111n551101113
    8001000I24011000Y40101000o561110004
    9001001J25011001Z41101001p571110015
    10001010K26011010a42101010q581110106
    11001011L27011011b43101011r591110117
    12001100M28011100c44101100s601111008
    13001101N29011101d45101101t611111019
    14001110O30011110e46101110u62111110+
    15001111P31011111f47101111v63111111/
    Padding=

舉例說明

  • 最后一組三個字節(jié),不用補位

? 'abc'字符串 底層的二進(jìn)制為 011000010110001001100011,這是24個bit為一組,以6bit分為四部分為 011000 010110 001001 100011 編碼成對應(yīng)上表的字符 ’ YWJj' 。

byte[] src = "abc".getBytes(StandardCharsets.UTF_8); byte[] encoded = Base64.encode(src);System.out.printf("字符串'%s'編碼后的字符結(jié)果:'%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'編碼后的字符結(jié)果:'YWJj' 原長度:3,編碼后的長度:4, 編碼后是原來的1.33
  • 最后一組只有兩個字節(jié),補2bit 0

    ? 'ab'字符串 底層的二進(jìn)制為 0110000101100010,補位成 011000010110001000,以6bit分為三部分為 011000 010110 001000 編碼成對應(yīng)上表的字符 ’ YWI' ,因為比一般的少一個編碼單位,所以在后面加上一個=字符,最終的結(jié)果就是 ’ YWI=' 。

byte[] src = "ab".getBytes(StandardCharsets.UTF_8); byte[] encoded = Base64.encode(src);System.out.printf("字符串'%s'編碼后的字符結(jié)果:'%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); 字符串'ab'編碼后的字符結(jié)果:'YWI=' 原長度:2,編碼后的長度:4, 編碼后是原來的2.00
  • 最后一組只有一個字節(jié) 補4bit0

    ? 'a'字符串 底層的二進(jìn)制為 01100001,補位成 011000010000這是24個bit為一組,以6bit分為四部分為 011000 010000 編碼成對應(yīng)上表的字符 ’ YQ' ,因為比一般的少兩個編碼單位,所以后面加上兩個=字符,最終的結(jié)果就是 ’ YQ==' 。

byte[] src = "a".getBytes(StandardCharsets.UTF_8); byte[] encoded = Base64.encode(src);System.out.printf("字符串'%s'編碼后的字符結(jié)果:'%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); 字符串'a'編碼后的字符結(jié)果:'YQ==' 原長度:1,編碼后的長度:4, 編碼后是原來的4.00

由于在編碼的過程中只有最后一組才有可能存在補位情況,所以我們可以認(rèn)為 使用base64編碼后數(shù)據(jù)的體積是原來的1.33倍

總結(jié)

? HEX編碼的特點是:解碼編碼速度快但是體積變大了一倍;Base64編碼的特點: 體積小,但是由于算法相對復(fù)雜所以解碼編碼速度比較慢。

? 由于兩種編碼規(guī)則可以是任何二進(jìn)制的數(shù)據(jù)編碼成字符集可以翻譯二進(jìn)制數(shù)據(jù),這樣的話我們就輕而易舉的把二進(jìn)制數(shù)據(jù)打印顯示出來。便于我們查看二進(jìn)制數(shù)據(jù)。有些網(wǎng)絡(luò)協(xié)議傳輸只支持文本流的二進(jìn)制數(shù)據(jù)傳輸,所以這時候就可以使用這兩種編碼。

總結(jié)

以上是生活随笔為你收集整理的HEX编码、Base64编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。