Java base64编码解码工具类-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

Java base64编码解码工具类

简介:

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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")));
  }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章