Java base64编码解码工具类

前几天无意中看到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")));
  }
}

 

 

转载于:https://my.oschina.net/itblog/blog/204413

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值