Java base64编码解码工具类

Wesley13
• 阅读 780

前几天无意中看到Java中有Base64编码,不解的我去百科了一下,了解了Base64的基本使用和实现原理,于是在空暇时自己手动写了一个,这个类可以完成对字母数字的编码和解码工作,但是对于中文,还没有仔细研究其编码的实现过程。至于什么是Base64,用它来干什么,请移步到:http://zh.wikipedia.org/zh-cn/Base64 

下面贴出这个工具类的源代码,供朋友们参考,本人新手写得不好,请用力拍砖:

/************************Base64Util.java*****************************/

package util;

import java.util.HashMap;
import java.util.Map;

/**
 * This class is a tool class to convert Base64 string and 
 * normal string to each other. <br><br>
 * More information about base64, Please refer to: 
 * http://zh.wikipedia.org/zh-cn/Base64
 * @author user
 */
public class Base64Util {
  private static final Map<Integer, Character> base64CharMap = new HashMap<>();
  private static final String base64CharString = 
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  static {
    // initialize base64 map
    for (int i=0;i<base64CharString.length();i++){
      char c = base64CharString.charAt(i);
      base64CharMap.put(new Integer(i), new Character(c));
    }
  }

  /**
   * This method is used to encode a normal string to base64 string
   * @param origin
   * The String to be encoded
   * @return
   * The String after encoded.
   */
  public static String encode (String origin) {
    if (origin == null) {
      return null;
    }
    if (origin.length() == 0) {
      return "";
    }
    int length = origin.length();
    String binaryString = "";
    // to binary String
    for (int i=0;i<length;i++) {
      int ascii = origin.charAt(i);
      String binaryCharString = Integer.toBinaryString(ascii);
      while (binaryCharString.length() < 8) {
        binaryCharString = "0" + binaryCharString;
      }
      binaryString += binaryCharString;
    }

    // to base64 index
    int beginIndex = 0;
    int endIndex = beginIndex + 6;
    String base64BinaryString = "";
    String charString = "";
    while ((base64BinaryString = 
      binaryString.substring(beginIndex, endIndex)).length() > 0) {
      //if length is less than 6, add "0".
      while (base64BinaryString.length() < 6) {
        base64BinaryString += "0";
      }
      int index = Integer.parseInt(base64BinaryString, 2);
      char base64Char = base64CharMap.get(index);
      charString = charString + base64Char;
      beginIndex += 6;
      endIndex += 6;
      if (endIndex >= binaryString.length()) {
        endIndex = binaryString.length();
      }
      if (endIndex < beginIndex) {
        break;
      }
    }
    if (length % 3 == 2) {
      charString += "=";
    }
    if (length % 3 == 1) {
      charString += "==";
    }
    return charString;
  }

  /**
   * This method is used to decode from base64 string to a normal string.
   * @param encodedString
   * The string to be decoded.
   * @return
   * The string after decoded.
   */
  public static String decode(String encodedString) {
    if (encodedString == null) {
      return null;
    }
    if (encodedString.length() == 0) {
      return "";
    }
    //get origin base64 String
    String origin = encodedString.substring(0,encodedString.indexOf("="));
    String equals = encodedString.substring(encodedString.indexOf("="));

    String binaryString = "";
    //convert base64 string to binary string
    for (int i=0;i<origin.length();i++) {
      char c = origin.charAt(i);
      int ascii = base64CharString.indexOf(c);
      String binaryCharString = Integer.toBinaryString(ascii);
      while (binaryCharString.length() < 6) {
        binaryCharString = "0" + binaryCharString;
      }
      binaryString += binaryCharString;
    }
    // the encoded string has 1 "=", means that the binary string has append 2 "0"
    if (equals.length() == 1) {
      binaryString = binaryString.substring(0,binaryString.length()-2);
    }
    // the encoded string has 2 "=", means that the binary string has append 4 "0"
    if (equals.length() == 2) {
      binaryString = binaryString.substring(0,binaryString.length()-4);
    }

    // convert to String
    String charString = "";
    String resultString = "";
    int beginIndex = 0;
    int endIndex = beginIndex + 8;
    while ((charString = 
      binaryString.substring(beginIndex, endIndex)).length() == 8) {
      int ascii = Integer.parseInt(charString, 2);
      resultString += (char)ascii;
      beginIndex += 8;
      endIndex += 8;
      if (endIndex > binaryString.length()) {
        break;
      }
    }
    return resultString;
  }

  // Test methods here.
  public static void main(String[] args) {
    String originString = 
      "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.";
    String base64String = 
      "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz" +
      "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg" +
      "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu" +
      "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo" +
      "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="; 

    System.out.println("===============encode=================");
    String result = encode(originString);
    System.out.println(result);
    System.out.println(result.equals(base64String));
    System.out.println("===============decode=================");
    String decodedString = decode(base64String);
    System.out.println(decodedString);
    System.out.println(originString.equals(decodedString));
    System.out.println(decode(encode("abcdefg")));
  }
}
点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java 实现PHP gzcompress 功能
为了直观加了base64 PHP代码:<?php$agzcompress("abc");echobase64_encode($a);//输出:eJxLTEoGAAJNASc解码:gzuncompress();源码提示默认使用的是zlib的 deflate进行编码的;
Wesley13 Wesley13
3年前
java最常用的几种加密算法
1\.BASE64Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在JavaPersistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128bit的UUI
Kubrnete Kubrnete
3年前
某个加密大马的解密
我们先来大致看看这个webshell长什么样下面的就是用base64进行编码后的样子,因为太长我就不给图了这里就是这个脚本余下的内容了,最下面的那个函数也就是解开这个加密whellshell的秘钥了,进过观察后我们发现了两个可以点,第一个就是那一大段的base64编码,然后就是那下面的一段,查了一下说是ECMAScript既然这样,我们先按照常规思路将被b
Stella981 Stella981
3年前
Base64编码
Base64的来源Base64的主要用途是将不可打印字符转换成可打印字符,而什么需要这样转换呢?因为有些网络传输渠道并不能支持传输所有字节,一些不可见字符(如控制字符)在传统的邮件系统中就无法传输,而例如图片文件不可能每个字节都是可见字符,这样就导致用途这些渠道的用途受到很大限制。Base64正是解决这一问题,通过64个可见字符来编码各种字符,使得数
Wesley13 Wesley13
3年前
Java Base64 编码解码方案总结
Java技术栈,每天给你诚意满满的干货Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便。在实际应用上,Base64除了能将Binary资料可视化之外,也常用来表示字串加密过后的内容。如果要使用Java程式语言来实作Base64的编码与解码功
Stella981 Stella981
3年前
JavaScript用btoa和atob来编码解码Base64
btoa和atob是window对象的两个函数,其中btoa是binarytoascii,用于将binary的数据用ascii码表示,即Base64的编码过程,而atob则是asciitobinary,用于将ascii码解析成binary数据,看一个例子://Definethestringvarstring'Hel
Wesley13 Wesley13
3年前
Html5 FileReader 对文件进行Base64编码
以Base64进行编码的数据Url开始越来越广泛的被应用起来,原来做Base64转换要自己写一个小程序来转,其实Html5的FileReader的readAsDataURL方法读取出的数据就已经是Base64数据格式的Url了,利用FileReader实现一个对本地文件进行读取并且转换为Base64Url的页面也非常简单。页面地址:http://z