亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中Base64編碼原理實(shí)例講解

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

什么是 Base64 編碼

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

使用場(chǎng)景

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

Base64 編碼原理

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

Base64 標(biāo)準(zhǔn)編碼表:

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

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


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

對(duì)于字符內(nèi)容,相同字符串不同的字符編碼(如 utf-8 與 gbk)的 Base64 編碼結(jié)果會(huì)不一樣。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)來進(jìn)行 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 進(jìn)行優(yōu)化并放到 JDK 的 java.util 包,所以推薦直接使用 java.util.Base64 進(jìn)行 Base64 編碼和解碼。

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

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

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

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

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

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

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

小結(jié)

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

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

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

經(jīng)過 Base64 編碼后數(shù)據(jù)會(huì)增大,因?yàn)槊?3 個(gè)字節(jié),重新劃分為 4 個(gè)字節(jié),數(shù)據(jù)大小會(huì)變?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編碼原理實(shí)例講解的文章就介紹到這了,更多相關(guān)java中base64編碼原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中自動(dòng)裝箱、拆箱引起的耗時(shí)詳解

    Java中自動(dòng)裝箱、拆箱引起的耗時(shí)詳解

    這篇文章主要給大家介紹了關(guān)于Java中自動(dòng)裝箱、拆箱引起的耗時(shí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java解決代碼重復(fù)的三個(gè)絕招分享

    Java解決代碼重復(fù)的三個(gè)絕招分享

    本文將從業(yè)務(wù)代碼中最常見的三個(gè)需求展開,聊聊如何使用?Java?中的一些高級(jí)特性、設(shè)計(jì)模式,以及一些工具消除重復(fù)代碼,才能既優(yōu)雅又高端
    2022-07-07
  • 使用Log4j為項(xiàng)目配置日志輸出應(yīng)用詳解以及示例演示的實(shí)現(xiàn)分析

    使用Log4j為項(xiàng)目配置日志輸出應(yīng)用詳解以及示例演示的實(shí)現(xiàn)分析

    本篇文章是對(duì)Log4j為項(xiàng)目配置日志輸出應(yīng)用詳解以及示例演示的實(shí)現(xiàn)進(jìn)行了分析介紹,需要的朋友參考下
    2013-05-05
  • SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證

    SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證

    本文主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • java猜數(shù)字小游戲案例

    java猜數(shù)字小游戲案例

    這篇文章主要為大家詳細(xì)介紹了java猜數(shù)字小游戲案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Java中的隨機(jī)數(shù)詳解

    Java中的隨機(jī)數(shù)詳解

    這篇文章主要介紹了Java中的隨機(jī)數(shù),需要的朋友可以參考下
    2014-02-02
  • Spring?MVC??接受請(qǐng)求參數(shù)的方法

    Spring?MVC??接受請(qǐng)求參數(shù)的方法

    了解HTTP請(qǐng)求的GET和POST方法中如何攜帶參數(shù),以及SpringMVC中如何接收這些參數(shù),GET方法通過URL傳遞參數(shù),而POST方法通常在請(qǐng)求體中傳遞,SpringMVC使用注解如@RequestParam和@RequestBody來綁定參數(shù)到控制器方法
    2024-09-09
  • java實(shí)現(xiàn)微信App支付服務(wù)端

    java實(shí)現(xiàn)微信App支付服務(wù)端

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信App支付服務(wù)端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Java定時(shí)任務(wù)Timer、TimerTask與ScheduledThreadPoolExecutor詳解

    Java定時(shí)任務(wù)Timer、TimerTask與ScheduledThreadPoolExecutor詳解

    這篇文章主要介紹了Java定時(shí)任務(wù)Timer、TimerTask與ScheduledThreadPoolExecutor詳解,  定時(shí)任務(wù)就是在指定時(shí)間執(zhí)行程序,或周期性執(zhí)行計(jì)劃任務(wù),Java中實(shí)現(xiàn)定時(shí)任務(wù)的方法有很多,本文從從JDK自帶的一些方法來實(shí)現(xiàn)定時(shí)任務(wù)的需求,需要的朋友可以參考下
    2024-01-01
  • Redis結(jié)合AOP與自定義注解實(shí)現(xiàn)分布式緩存流程詳解

    Redis結(jié)合AOP與自定義注解實(shí)現(xiàn)分布式緩存流程詳解

    項(xiàng)目中如果查詢數(shù)據(jù)是直接到MySQL數(shù)據(jù)庫中查詢的話,會(huì)查磁盤走IO,效率會(huì)比較低,所以現(xiàn)在一般項(xiàng)目中都會(huì)使用緩存,目的就是提高查詢數(shù)據(jù)的速度,將數(shù)據(jù)存入緩存中,也就是內(nèi)存中,這樣查詢效率大大提高
    2022-11-11

最新評(píng)論