日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java中的Base64详解

發(fā)布時(shí)間:2024/3/7 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的Base64详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

詳解Java中的Base64原理跟用法

簡(jiǎn)介

? Base64編碼,是我們程序開發(fā)中經(jīng)常使用到的編碼方法。它是一種基于用64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法。它通常用作存儲(chǔ)、傳輸一些二進(jìn)制數(shù)據(jù)編碼方法, 也是MIME(多用途互聯(lián)網(wǎng)郵件擴(kuò)展,主要用作電子郵件標(biāo)準(zhǔn))中一種可打印字符表示二進(jìn)制數(shù)據(jù)的常見編碼方法。它其實(shí)只是定義用可打印字符傳輸內(nèi)容一種方法,并不會(huì)產(chǎn)生新的字符集。嚴(yán)格來說Base64并不是一種加密/解密算法,而是一種編碼方式。Base64不生成密鑰,通過Base64編碼后的密文就可以直接“翻譯”為明文,但是可以通過向明文中添加混淆字符來達(dá)到加密的效果。

Base64實(shí)現(xiàn)轉(zhuǎn)換原理

? 它是用64個(gè)可打印字符表示二進(jìn)制所有數(shù)據(jù)方法。由于2的6次方等于64,所以可以用每6個(gè)位元為一個(gè)單元,對(duì)應(yīng)某個(gè)可打印字符。我們知道三個(gè)字節(jié)有24個(gè)位元,就可以剛好對(duì)應(yīng)于4個(gè)Base64單元,即3個(gè)字節(jié)需要用4個(gè)Base64的可打印字符來表示。在Base64中的可打印字符包括字母A-Z、a-z、數(shù)字0-9 ,這樣共有62個(gè)字符,此外兩個(gè)可打印符號(hào)在不同的系統(tǒng)中一般有所不同。但是,我們經(jīng)常所說的Base64另外2個(gè)字符是:“+/”。這64個(gè)字符,所對(duì)應(yīng)表如下:

? 轉(zhuǎn)換的時(shí)候,將三個(gè)byte的數(shù)據(jù),先后放入一個(gè)24bit的緩沖區(qū)中,先來的byte占高位。數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補(bǔ)足。然后,每次取出6個(gè)bit,按照其值選擇
**ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/**中的字符作為編碼后的輸出。不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。

如果最后剩下兩個(gè)輸入數(shù)據(jù),在編碼結(jié)果后加1個(gè)“=”;如果最后剩下一個(gè)輸入數(shù)據(jù),編碼結(jié)果后加2個(gè)“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。

編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長(zhǎng),為原來的4/3。無論什么樣的字符都會(huì)全部被編碼,因此不像Quoted-printable編碼,還保留部分可打印字符。所以,它的可讀性不如Quoted-printable編碼!


? M的Ascii碼是77,前六位對(duì)應(yīng)值為19,對(duì)應(yīng)base64字符是T,如此類推。其它字符編碼就可以自動(dòng)轉(zhuǎn)換得到!我們看看另外不是剛好是3個(gè)字節(jié)的情況!

代碼示例

import java.io.UnsupportedEncodingException;/*** @Description 演示Base64的加密、解密* @author ShengLiu* @date 2018/6/20*/ public class Base64Demo {public static void main(String[] args) {//加密System.out.println(Base64Demo.getBase64Encode("Hello,World!"));//解密System.out.println(Base64Demo.getBase64Decode("SGVsbG9Xb3JsZA=="));}public static String getBase64Encode(String str) {if (str == null || "".equals(str)) {return "";}try {byte[] bt = str.getBytes("UTF-8");str = String.valueOf(Base64.encode(bt));} catch (UnsupportedEncodingException e) {e.printStackTrace();}return str;}public static String getBase64Decode(String str) {if (str == null || "".equals(str)) {return "";}char[] ch = str.toCharArray();byte[] bt = Base64.decode(String.valueOf(ch));try {str = new String(bt,"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return str;} }

輸出結(jié)果

SGVsbG/vvIxXb3JsZCE= HelloWorld

代碼示例

package com.test.demo;import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;/*** @Description Base64的加密、解密測(cè)試* @author ShengLiu* @date 2018/6/20*/ public class Base64 {public static void main(String[] args) {System.out.println(Base64.getBase64Encode("你們好!!!"));System.out.println(Base64.getBase64Decode("5L2g5Lus5aW977yB77yB77yB"));}// 加密public static String getBase64Encode(String str) {byte[] b = null;String s = null;try {b = str.getBytes("utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}if (b != null) {s = new BASE64Encoder().encode(b);}return s;}// 解密public static String getBase64Decode(String s) {byte[] b = null;String result = null;if (s != null) {BASE64Decoder decoder = new BASE64Decoder();try {b = decoder.decodeBuffer(s);result = new String(b, "utf-8");} catch (Exception e) {e.printStackTrace();}}return result;} }

輸出結(jié)果

5L2g5Lus5aW977yB77yB77yB 你們好!!!

sun.misc.BASE64Encoder詳解

(一)、BASE64編碼規(guī)則及JAVA中的使用

1、編碼規(guī)則:

Base64編碼要求把3個(gè)8位字節(jié)(3*8=24)轉(zhuǎn)化為4個(gè)6位的字節(jié)(4*6=24),之后在6位的前面補(bǔ)兩個(gè)0,形成8位一個(gè)字節(jié)的形式。
例如字符串“張3” :
11010101 11000101 00110011
用十進(jìn)制表示即為:53 34 20 51
這個(gè)并不是最終的結(jié)果,還需要根據(jù)Base64的編碼表查詢出轉(zhuǎn)換后值。
下面就是BASE64編碼表:

Table 1: The Base64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v (pad) = 14 O 31 f 48 w 15 P 32 g 49 x 16 Q 33 h 50 y
  • 以上一共是64個(gè)編碼,這也是Base64名稱的由來。
  • 編碼的編號(hào)(1-64)對(duì)應(yīng)的是得出的新字節(jié)的十進(jìn)制值。因此,上例中字符串“張3”經(jīng)過編碼后就成了字符串“1iUz”了。
  • 若要對(duì)只有兩個(gè)字節(jié)的字符串進(jìn)行編碼,如“張”,則在其編碼結(jié)果的后面加“=”,即“1iU=”。
  • 若要對(duì)只有一個(gè)字節(jié)的字符串進(jìn)行編碼,如“3”,則在其編碼結(jié)果的后面加“”,即“z”。
  • 2、編碼和解碼

    在JAVA中要實(shí)現(xiàn)Base64的編碼和解碼是非常容易的,因?yàn)镴DK中已經(jīng)有提供有現(xiàn)成的類:
    編碼:

    String src ="BASE64編碼測(cè)試"; sun.misc.BASE64Encoder en = new sun.misc.BASE64Encoder(); String encodeStr = en.encode(src.getBytes());

    解碼:

    sun.misc.BASE64Decoder dec = newsun.misc.BASE64Decoder(); byte[] data = dec.decodeBuffer(decodeStr);

    更多知識(shí)點(diǎn)參考請(qǐng)點(diǎn)擊這里

    filename = "=?UTF-8?B?"+new BASE64Encoder().encoder(filename.getBytes("utf-8"))+"?=";

    BASE64Encoder 加密和解密

    public class B64Demo {public static String getBASE64(String s) { if (s == null) return null; return (new sun.misc.BASE64Encoder()).encode(s.getBytes()); } // 將 BASE64 編碼的字符串 s 進(jìn)行解碼public static String getFromBASE64(String s) { if (s == null) return null; sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder(); try { byte[] b = decoder.decodeBuffer(s); return new String(b); } catch (Exception e) { return null; } } // 將 BASE64 編碼的字符串 s 進(jìn)行加密,即對(duì)字符串進(jìn)行三次的BASE64編碼public static String encryption(Object obj){return B64Demo.getBASE64(B64Demo.getBASE64(B64Demo.getBASE64((String)obj)));}// 將 BASE64 編碼的字符串 s 進(jìn)行解密,即對(duì)字符串進(jìn)行三次的BASE64解碼public static String decryption(String 3b64){return B64Demo.getFromBASE64(B64Demo.getFromBASE64(B64Demo.getFromBASE64(3b64)));}public static void main(String[] args) {String a = encryption("100000.89".toString());System.out.println(a);//加密System.out.println(decryption(a));//解密} }

    一、jdk1.8下的 BASE64Encoder 和 BASE64Decoder(JDK9開始已移除):

    import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;public class test {public static void main(String[] args) throws Exception {String str = "hello word";BASE64Encoder base64Encoder = new BASE64Encoder();// JDK1.8 BASE64Encoder 加密String encode = base64Encoder.encode(str.getBytes());System.out.println(encode);BASE64Decoder base64Decoder = new BASE64Decoder();// JDK1.8 BASE64Decoder 解密byte[] bytes = base64Decoder.decodeBuffer(encode);String res = new String(bytes);System.out.println(res);} }

    二、推薦使用Base64:

    package com.lmp.utils;import java.util.Base64;public class test {public static void main(String[] args) throws Exception {String str = "hello word";// JDK1.8 Base64加密String encode = Base64.getEncoder().encodeToString(str.getBytes());System.out.println(encode);// JDK1.8 Base64解密byte[] bytes = Base64.getDecoder().decode(encode);String res = new String(bytes);System.out.println(res);}}

    ?

    總結(jié)

    以上是生活随笔為你收集整理的Java中的Base64详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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