暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java新特性解读JDK8之Base64

227decision 2019-12-29
2398

Base64到底能做什么?

  1. 网络中的语言文字,底层都是用二进制存储的,网络传播时,可以对二进制进行Base64编码后传输,解决各国语言传输时乱码问题;

  2. URL特殊字符转义:http协议中,特殊字符会被当做转义字符处理,所以要对特殊字符转义,保证参数正确;

  3. Html中嵌入图片,可以不需要图片路径,使用src="图片经过Base64编码后的内容"。

Base64是一种编码方式(换一种体现形式,便于传输,提高可读性),不是加密算法(把明文变为难破解的密文,加大识别难度)

Base64原理是什么?

什么是Base64编码:Base64是⽹络上最常见的⽤于传输8Bit字节码的编码⽅式之⼀,Base64就是 ⼀种基于64个可打印字符来表示⼆进制数据的⽅法 基于64个字符A-Z,a-z,0-9,+,/的编码⽅式, 是⼀种能将任意⼆进制数据⽤64种字元组合成字符串的⽅法,⽽这个⼆进制数据和字符串资料之 间是可以互相转换的。

为什么是64个字符:常用字符集编码(GB2312,GBK,UTF-8)中,一个字符一般最多三个字节表示,3*8=24bit,Base64每6个bit一组,6bit十进制范围为0~63,考虑到显示方便(64个字符就可以完全对应显示)和节省存储(Base64字符表中的字符原本用6个bit就可以表示,现在前面添加2个0,变为8个bit,会造成一定的浪费。因此,Base64编码之后的文本,要比原文大约三分之一

手算Base64

例如:"冬至"转换为Base64编码

实现步骤:

  1. 找到中文字符在操作系统中对应的字符编码(参考代码页字符对照表,windows10为GB2312);

  2. 找到中文字符编码的十进制值,把十进制转换为二进制(参考GB2312简体中文编码表);

  3. 对二进制分组,每6bit一组(最后不足6bit补0);

“冬”:

16进制表示:B6A0,+C  

十进制 :46752+12=46764

二进制:1011011010101100     

"至":

二进制:1101011011000001

分组后:101101  101010  110011  010110  110000  01

手算“冬至”Base64编码结果为  tqzWwQ

Java处理Base64

    package com.example.base64demo;
    import java.io.IOException;
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    public class JDK8BeforeBase64 {
    /**
    * JDK8之前Base64编解码处理
    * 缺点:编解码效率差
    * @param args
    * @throws IOException
    */
    public static void main(String[] args) throws IOException {
    BASE64Encoder encoder = new BASE64Encoder();
    BASE64Decoder decoder = new BASE64Decoder();
    String text = "我的祖国";
    byte[] textByte = text.getBytes("UTF-8");
    //编码
    String encodedText = encoder.encode(textByte);
    System.out.println(encodedText);
    //解码
         System.out.println(new String(decoder.decodeBuffer(encodedText),
         "UTF-8")); 
    }
    }

    //还有一种方式是Apache Commons Codec有提供Base64编码和解码,缺点是需要引用


      package com.example.base64demo;
      import java.io.UnsupportedEncodingException;
      import java.util.Base64;
      public class JDK8Base64 {
      /**
      * JDK8的java.util包中,新增了Base64的类
      * @param args
      * @throws UnsupportedEncodingException
      */
      public static void main(String[] args) throws UnsupportedEncodingException {
      Base64.Decoder decoder = Base64.getDecoder();
      Base64.Encoder encoder = Base64.getEncoder();
      String text = "冬至";
      byte[] textByte = text.getBytes("GB2312");
      //编码
      String encodedText = encoder.encodeToString(textByte);
      System.out.println(encodedText);
      //解码
      System.out.println(new String(decoder.decode(encodedText), "GB2312"));
        }
      }

      补充说明

      “=”或“==”号出现在Base64的编码结果中,“=”在此是作为填充字符出现;

      不同编码对应Base64编码结果都不一样。



      最后修改时间:2020-07-01 13:37:35
      文章转载自227decision,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论