最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中Base64編碼原理實例講解

 更新時間:2021年02月09日 21:09:50   作者:陸十三  
這篇文章主要介紹了java中Base64編碼原理實例講解,文章講解的很清晰,有對于這方面不太懂的同學(xué)可以研究下

什么是 Base64 編碼

Base64 編碼是最常見的編碼方式,基于 64 個可打印字符來表示任意二進制數(shù)據(jù)的方法,是從二進制轉(zhuǎn)換到可見字符的過程。

使用場景

數(shù)據(jù)加密或簽名通過 Base64 轉(zhuǎn)換為字符串存儲或傳輸。
不能傳輸文件的網(wǎng)絡(luò)環(huán)境可以轉(zhuǎn)換 Base64 進行網(wǎng)絡(luò)傳輸。
在文本資源(如 HTML 和 CSS文件)中嵌入圖片文件或其他二進制資源。
在 URL、網(wǎng)頁中傳輸少量二進制數(shù)據(jù)等等。

Base64 編碼原理

原理是把每 3 個字節(jié)(每個字節(jié)為 8 位, 3 個字節(jié)為 24 位)重新劃為 4 組(每組為 6位,高位補兩個 0 為 8 位后作為一個新字節(jié),劃分后的每個字節(jié)數(shù)值的范圍是 00000000 - 00111111 即十進制的 0 - 63),然后將劃分后的字節(jié)的數(shù)值作為索引查編碼表,獲得相應(yīng)的字符,從而得到編碼后的字符串。通過 64 個字符來對任意數(shù)據(jù)進行編碼,因此稱為 Base64。

Base64 標準編碼表:

以字符串 “NEW” 為例,對其 Base64 編碼:

如果要編碼的字節(jié)數(shù)不能被 3 整除,最后會多出 1 個或 2 有效的字節(jié)。將這樣處理,將其用 0 補充至 6 的最小倍數(shù)位后,剩余的空位將使用 “=” 填充處理。例如:


經(jīng)過 Base64 編碼后數(shù)據(jù)會增大,數(shù)據(jù)經(jīng)過 Base64 處理后,由原來每 3 個字節(jié),變?yōu)闉?4 個字節(jié),數(shù)據(jù)大小會變?yōu)樵瓉淼?4/3, 因此數(shù)據(jù)增大 1/3。

對于字符內(nèi)容,相同字符串不同的字符編碼(如 utf-8 與 gbk)的 Base64 編碼結(jié)果會不一樣。Base64 是一種通過查表的編碼方法,不能用于加密,即使是自定義編碼表也不行。

JDK 內(nèi)置的 Base64 API

在 JDK 7 之前可以使用 sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder 來 Base64 編碼解碼,但 com.sun 開頭的包不是公開的,屬于 sun 的內(nèi)部方法,不建議使用。所以可以使用 Apache 提供的工具包(commons-codec-1.11.jar)來進行 Base64 編碼解碼。

從 JDK 7 開始 Oracle 發(fā)表了聲明,不希望 Java 程序調(diào)用 JDK 系統(tǒng)包中以 sun 開頭的類(www.oracle.com/technetwork/java/faq-sun-packages-142232.html)。

從 JKD 8 開始,Oracle 已經(jīng)把 Base64 進行優(yōu)化并放到 JDK 的 java.util 包,所以推薦直接使用 java.util.Base64 進行 Base64 編碼和解碼。

// Base64 編碼
String encoder = Base64.getEncoder().encodeToString("但愿人長久 千里共嬋娟".getBytes());
System.err.println(encoder);		

// Base64 解碼
String decoder = new String(Base64.getDecoder().decode(encoder));
System.err.println(decoder);

// 結(jié)果
// 5L2G5oS/5Lq66ZW/5LmFIOWNg+mHjOWFseWpteWonw==
// 但愿人長久 千里共嬋娟

標準的 Base64 編碼中可能出現(xiàn)字符 + 和 / 字符,不能直接用在 URL 中,需要對其進行處理,把字符 + 和 / 分別變成 - 和 _ ,JDK 也提供了對應(yīng)的方法。

// URL安全的 Base64 編碼
String safeEncoder = Base64.getUrlEncoder().encodeToString("但愿人長久 千里共嬋娟".getBytes());
System.err.println(safeEncoder);	

// URL安全的 Base64 解碼
String safeDecoder = new String(Base64.getUrlDecoder().decode(safeEncoder));
System.err.println(safeDecoder);

// 結(jié)果
// 5L2G5oS_5Lq66ZW_5LmFIOWNg-mHjOWFseWpteWonw==
// 但愿人長久 千里共嬋娟

小結(jié)

Base64 是基于 64 個可打印字符來表示任意二進制數(shù)據(jù)的方法。

Base64 通常用于數(shù)據(jù)加密或簽名后轉(zhuǎn)換為可見字符串,文本資源(如 HTML 和 CSS 中)中嵌入圖片文件等等。

原理是把二進制數(shù)據(jù)每 3 個字節(jié)重新劃為 4 組(每三個 8 位字節(jié),即總共24位,可以由四個 6 位 Base64 數(shù)值表示),然后作為索引查編碼表,獲得相應(yīng)的字符,從而得到編碼后的字符串。

經(jīng)過 Base64 編碼后數(shù)據(jù)會增大,因為每 3 個字節(jié),重新劃分為 4 個字節(jié),數(shù)據(jù)大小會變?yōu)樵瓉淼?4/3, 因此數(shù)據(jù)增大 1/3。

Base64 是一種通過索引查表的編碼方法,不能用于加密。

參考:
https://en.wikipedia.org/wiki/Base64
https://www.ietf.org/rfc/rfc4648.txt
https://www.liaoxuefeng.com/wiki/897692888725344/949441536192576

到此這篇關(guān)于java中Base64編碼原理實例講解的文章就介紹到這了,更多相關(guān)java中base64編碼原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot集成整合JWT與Shiro流程詳解

    SpringBoot集成整合JWT與Shiro流程詳解

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot集成JWT、Shiro框架的使用
    2022-12-12
  • Java 單向隊列及環(huán)形隊列的實現(xiàn)原理

    Java 單向隊列及環(huán)形隊列的實現(xiàn)原理

    本文主要介紹了Java 單向隊列及環(huán)形隊列的實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 基于Class.forName()用法及說明

    基于Class.forName()用法及說明

    這篇文章主要介紹了基于Class.forName()用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • MyBatis關(guān)聯(lián)查詢的實現(xiàn)

    MyBatis關(guān)聯(lián)查詢的實現(xiàn)

    MyBatis可以通過定義多個表的關(guān)聯(lián)關(guān)系,實現(xiàn)多表查詢,本文主要介紹了MyBatis關(guān)聯(lián)查詢的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • java發(fā)送http get請求的兩種方法(總結(jié))

    java發(fā)送http get請求的兩種方法(總結(jié))

    下面小編就為大家?guī)硪黄猨ava發(fā)送http get請求的兩種方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringMVC @ControllerAdvice使用場景

    SpringMVC @ControllerAdvice使用場景

    這篇文章主要介紹了SpringMVC @ControllerAdvice使用場景,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 詳解SpringBoot 快速整合Mybatis(去XML化+注解進階)

    詳解SpringBoot 快速整合Mybatis(去XML化+注解進階)

    本篇文章主要介紹了詳解SpringBoot 快速整合Mybatis(去XML化+注解進階),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • MybatisPlus多數(shù)據(jù)源及事務(wù)解決思路

    MybatisPlus多數(shù)據(jù)源及事務(wù)解決思路

    這篇文章主要介紹了MybatisPlus多數(shù)據(jù)源及事務(wù)解決思路,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java中守護線程介紹及使用

    Java中守護線程介紹及使用

    大家好,本篇文章主要講的是Java中守護線程介紹及使用,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 使用Java DOM解析器修改XML文件內(nèi)容的操作方法

    使用Java DOM解析器修改XML文件內(nèi)容的操作方法

    在Java中,XML文件的解析和修改可以通過多種方法實現(xiàn),其中DOM(Document Object Model)是一種常用的方式,在本文中,我們將介紹如何使用Java DOM解析器修改XML文件中的內(nèi)容,并給出一個具體的示例,需要的朋友可以參考下
    2024-08-08

最新評論

高要市| 奉节县| 蓝田县| 南木林县| 华阴市| 宜春市| 临汾市| 大方县| 沁源县| 濮阳县| 永川市| 绍兴县| 仁化县| 永福县| 云安县| 澄迈县| 孟村| 巨鹿县| 桓台县| 桓台县| 高邑县| 杂多县| 元阳县| 廉江市| 格尔木市| 南溪县| 安溪县| 行唐县| 云浮市| 玉环县| 贞丰县| 天柱县| 金塔县| 东阿县| 镇宁| 宿州市| 酉阳| 文成县| 江口县| 崇州市| 广东省|