Base64Util
1 package com.jf.utils; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 7 public class Base64Utils { 8 9 private static final Map<Integer, Character> base64CharMap = new HashMap<Integer, Character>(); 10 private static final String base64CharString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 11 12 static { 13 for (int i = 0; i < base64CharString.length(); i++) { 14 char c = base64CharString.charAt(i); 15 base64CharMap.put(new Integer(i), new Character(c)); 16 } 17 } 18 19 public static String encode(String origin) { 20 if (origin == null) { 21 return null; 22 } 23 if (origin.length() == 0) { 24 return ""; 25 } 26 int length = origin.length(); 27 String binaryString = ""; 28 for (int i = 0; i < length; i++) { 29 int ascii = origin.charAt(i); 30 String binaryCharString = Integer.toBinaryString(ascii); 31 while (binaryCharString.length() < 8) { 32 binaryCharString = "0" + binaryCharString; 33 } 34 binaryString += binaryCharString; 35 } 36 int beginIndex = 0; 37 int endIndex = beginIndex + 6; 38 String base64BinaryString = ""; 39 String charString = ""; 40 while ((base64BinaryString = binaryString.substring(beginIndex, endIndex)).length() > 0) { 41 // if length is less than 6, add "0". 42 while (base64BinaryString.length() < 6) { 43 base64BinaryString += "0"; 44 } 45 int index = Integer.parseInt(base64BinaryString, 2); 46 char base64Char = base64CharMap.get(index); 47 charString = charString + base64Char; 48 beginIndex += 6; 49 endIndex += 6; 50 if (endIndex >= binaryString.length()) { 51 endIndex = binaryString.length(); 52 } 53 if (endIndex < beginIndex) { 54 break; 55 } 56 } 57 if (length % 3 == 2) { 58 charString += "="; 59 } 60 if (length % 3 == 1) { 61 charString += "=="; 62 } 63 return charString; 64 } 65 66 /** 67 * This method is used to decode from base64 string to a normal string. 68 * 69 * @param encodedString 70 * The string to be decoded. 71 * @return The string after decoded. 72 */ 73 public static String decode(String encodedString) { 74 if (encodedString == null) { 75 return null; 76 } 77 if (encodedString.length() == 0) { 78 return ""; 79 } 80 // get origin base64 String 81 String origin = encodedString.substring(0, encodedString.indexOf("=")); 82 String equals = encodedString.substring(encodedString.indexOf("=")); 83 String binaryString = ""; 84 // convert base64 string to binary string 85 for (int i = 0; i < origin.length(); i++) { 86 char c = origin.charAt(i); 87 int ascii = base64CharString.indexOf(c); 88 String binaryCharString = Integer.toBinaryString(ascii); 89 while (binaryCharString.length() < 6) { 90 binaryCharString = "0" + binaryCharString; 91 } 92 binaryString += binaryCharString; 93 } 94 // the encoded string has 1 "=", means that the binary string has append 95 // 2 "0" 96 if (equals.length() == 1) { 97 binaryString = binaryString.substring(0, binaryString.length() - 2); 98 } 99 // the encoded string has 2 "=", means that the binary string has append 100 // 4 "0" 101 if (equals.length() == 2) { 102 binaryString = binaryString.substring(0, binaryString.length() - 4); 103 } 104 // convert to String 105 String charString = ""; 106 String resultString = ""; 107 int beginIndex = 0; 108 int endIndex = beginIndex + 8; 109 while ((charString = binaryString.substring(beginIndex, endIndex)).length() == 8) { 110 int ascii = Integer.parseInt(charString, 2); 111 resultString += (char) ascii; 112 beginIndex += 8; 113 endIndex += 8; 114 if (endIndex > binaryString.length()) { 115 break; 116 } 117 } 118 return resultString; 119 } 120 121 public static void main(String[] args) { 122 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."; 123 String base64String = "TWFxxxbxx" 125 + "dGhlIG1xxYSBwZXJzxxxY2xxx0aGUgY29udGlu" 126 + "dxxxxlIGdlbmVyYXRpb24gb2YxxxBleGNlZWRzIHRo" 127 + "xxx"; 128 System.out.println("===============encode================="); 129 String result = encode(originString); 130 System.out.println(result); 131 System.out.println(result.equals(base64String)); 132 133 System.out.println("===============decode================="); 134 String decodedString = decode(base64String); 135 System.out.println(decodedString); 136 System.out.println(originString.equals(decodedString)); 137 138 System.out.println(decode(encode("abcdefg"))); 139 } 140 }