1 importjava.io.ByteArrayOutputStream;2 importjava.io.IOException;3 importjava.io.StringWriter;4 importjava.util.Arrays;5 importjava.util.HashMap;6 importjava.util.Map;7
8 public classMyBase64 {9 private static final char[] set = ".0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
10 .toCharArray();11 /*
12 * 结尾表示填充0x0字符数目13 */
14 static final char blank = '-';15 /*
16 * 间隔三个字符分段17 */
18 static final int step = 3;19 /*
20 * 源数组结尾填021 */
22 static final byte fill = 0x0;23
24 private static MyBase64A myBase64 = null;25
26 public staticMyBase64A getInstance() {27 if (myBase64 == null) {28 synchronized (MyBase64A.class) {29 if (myBase64 == null) {30 myBase64 = newMyBase64A();31 }32 }33 }34 returnmyBase64;35 //return threadLocal.get();
36 }37
38 private static MapinitMap() {39 Map hashMap = new HashMap(40 set.length);41 for (int i = 0; i < set.length; i++) {42 hashMap.put(set[i], i);43 }44 returnhashMap;45 }46
47 private final Mapmap;48
49 privateMyBase64A() {50 map =initMap();51 }52
53 public byte[] reverseTrans(String string) throwsIOException {54 char[] chars =string.toCharArray();55
56 final int step = 4;57
58 int approximation = chars.length * 3 / 4;59 ByteArrayOutputStream byteArrayOutputStream = newByteArrayOutputStream(60 approximation);61
62 longswap;63 charc1, c2, c3, c4;64 byteb1, b2, b3;65
66 int begin = 0;67 int end =chars.length;68
69 int offset =begin;70 while (offset + 3
76 swap = (map.get(c1) & 0xff) << 18 | (map.get(c2) & 0xff) << 12
77 | (map.get(c3) & 0xff) << 6 | (map.get(c4) & 0xff);78
79 b1 = (byte) ((swap >> 16) & 0xff);80 b2 = (byte) ((swap >> 8) & 0xff);81 b3 = (byte) (swap & 0xff);82
83 byteArrayOutputStream.write(b1);84 byteArrayOutputStream.write(b2);85 byteArrayOutputStream.write(b3);86
87 offset +=step;88 }89 //logger.debug(end - offset);
90 byte[] bytes =Arrays.copyOf(byteArrayOutputStream.toByteArray(),91 byteArrayOutputStream.size() - (end -offset));92 returnbytes;93 }94
95 /**
96 *97 *@paramsource98 * 总之是一个字节队列。99 *@returnurl相容的 自制 base64编码100 */
101 public String trans(byte[] source) {102 int begin = 0, end =source.length;103 /*
104 * (source.length + 2) / 3 处以三,余数上限取整。 + 2 , 可能追加至多两个填充占位符。105 */
106 int approximation = (source.length + 2) / 3 * 4 + 2;107 StringWriter stringWriter = newStringWriter(approximation);108
109 intoffset;110 longswap;111 bytea, b, c;112 intnum1, num2, num3, num4;113 int app = 0;114
115 offset =begin;116 while (offset
131 swap = ((a & 0xff) << 16) | ((b & 0xff) << 8) | c & 0xff;132
133 //logger.debug(String.format("%x", swap));
134
135 num1 = (int) ((swap >> 18) & 63);136 num2 = (int) ((swap >> 12) & 63);137 num3 = (int) ((swap >> 6) & 63);138 num4 = (int) (swap & 63);139
140 stringWriter.append(set[num1]);141 stringWriter.append(set[num2]);142 stringWriter.append(set[num3]);143 stringWriter.append(set[num4]);144
145 offset +=step;146 }147 if (app == 1) {148 stringWriter.append(blank);149 }150 if (app == 2) {151 stringWriter.append(blank);152 stringWriter.append(blank);153 }154 returnstringWriter.toString();155 }156 }