zoukankan      html  css  js  c++  java
  • Java 8新特性之 Base64(八恶人-7)

    "General" 我是个将军

    “ You, sir a hyena. I hava no wish to speak to you.”  “你就是一个土狗,你不配跟我说话”

    一、基本介绍

      在JDK1.6之前,JDK核心类一直没有Base64的实现类,有人建议用Sun/Oracle JDK里面的sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder,使用它们的优点就是不需要依赖第三方类库,缺点就是可能在未来版本会被删除(用maven编译会发出警告),而且性能不佳。JDK1.6中添加了另一个Base64的实现,javax.xml.bind.DatatypeConverter两个静态方法parseBase64Binary 和 printBase64Binary,隐藏在javax.xml.bind包下面,不被很多开发者知道。在Java 8在java.util包下面实现了BASE64编解码API,而且性能不俗,API也简单易懂。我们先来了解一下Base64是干嘛的:

      知乎上有个非常易懂解释链接:https://www.zhihu.com/question/36306744/answer/71626823 ,如下为回答内容:
    我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。
    所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
    对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
    
    那么Base64到底是怎样编码的呢?
    简单来说,任何一个数据无非可以看作一个比特流,如01000100010011101100111010111100011001010......那么我们取6个比特为一组,计算它的ascii值,得到一个字符,这个字符肯定是可见字符,好,把它对应的字符写出来,再取6个比特,计算...,如此下去,直到最后,就完成了编码。
    1.标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;
    2.base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号);
    3.等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加凑齐3n位。为了正确还原,添加了几个就加上几个等号。显然添加等号的数目只能是0、1或2;
    4.严格来说base64不能算是一种加密,只能说是编码转换。使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来,以便复制粘贴;

    二、基本使用

    方法概览

    1、static Base64.Decoder getDecoder()
    返回Base64.Decoder解码使用基本型base64编码方案。
    2、static Base64.Encoder getEncoder()
    返回Base64.Encoder编码使用的基本型base64编码方案。
    3、static Base64.Decoder getMimeDecoder()
    返回Base64.Decoder解码使用MIME类型的base64解码方案。
    4、static Base64.Encoder getMimeEncoder()
    返回Base64.Encoder编码使用MIME类型base64编码方案。
    5、static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)
    返回Base64.Encoder编码使用指定的行长度和线分隔的MIME类型base64编码方案。
    6、static Base64.Decoder getUrlDecoder()
    返回Base64.Decoder解码使用URL和文件名安全型base64编码方案。
    7、static Base64.Encoder getUrlEncoder()
    返回Base64.Decoder解码使用URL和文件名安全型base64编码方案。

      

    该类提供了一套静态方法获取下面三种BASE64编解码器:

    1)Basic编码:是标准的BASE64编码,用于处理常规的需求

     1 try {
     2     // 编码
     3     String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
     4     System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=
     5     // 解码
     6     byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
     7     System.out.println(new String(asBytes, "utf-8")); // 输出为: some string
     8 }catch (java.io.UnsupportedEncodingException e){
     9     e.printStackTrace();
    10 }

      

    2)URL编码:使用下划线替换URL里面的反斜线“/”

    try {
        // 编码
        String asB64 = Base64.getUrlEncoder().encodeToString("some string/".getBytes("utf-8"));
        System.out.println(asB64); // 输出为: c29tZSBzdHJpbmcv
        // 解码
        byte[] asBytes = Base64.getUrlDecoder().decode("c29tZSBzdHJpbmcv");
        System.out.println(new String(asBytes, "utf-8")); // 输出为: some string/
    }catch (java.io.UnsupportedEncodingException e){
        e.printStackTrace();
    }

    3)MIME编码:使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“ ”符结束。

     1 try {
     2     // 编码
     3     String asB64 = Base64.getMimeEncoder().encodeToString("some string/".getBytes("utf-8"));
     4     System.out.println(asB64); // 输出为: c29tZSBzdHJpbmcv
     5     // 解码
     6     byte[] asBytes = Base64.getMimeDecoder().decode("c29tZSBzdHJpbmcv");
     7     System.out.println(new String(asBytes, "utf-8")); // 输出为: some string/
     8 }catch (java.io.UnsupportedEncodingException e){
     9     e.printStackTrace();
    10 }

      

    方法使用起来非常相近,也很好用。

    参考链接:

    https://www.zhihu.com/question/36306744/answer/71626823

    图片来源:八恶人(movie)

  • 相关阅读:
    Jquery练手 DEMO 全选 取消 反选 复选框 的实现
    ValidateTemplate(Label lb2, boolean iflag) {
    Android中更新UI的三种方式
    Doodle Android图片涂鸦,具有撤消、缩放、移动、添加文字,贴图等功能。还是一个功能强大,可自定义和可扩展的涂鸦框架、多功能画板。
    怎么用 javascript 实现拖拽
    System.Attribute 类的使用
    javascript 操作Cookie
    导航全局滑动JavaScript
    Sql server DATEADD() 函数
    类序列化
  • 原文地址:https://www.cnblogs.com/Jacck/p/8094720.html
Copyright © 2011-2022 走看看