1 25 package org.ofbiz.base.util; 26 27 35 36 public class Base64 { 37 38 private static byte[] Base64EncMap, Base64DecMap; 39 static { 40 byte[] map = 42 { 43 (byte) 'A', 44 (byte) 'B', 45 (byte) 'C', 46 (byte) 'D', 47 (byte) 'E', 48 (byte) 'F', 49 (byte) 'G', 50 (byte) 'H', 51 (byte) 'I', 52 (byte) 'J', 53 (byte) 'K', 54 (byte) 'L', 55 (byte) 'M', 56 (byte) 'N', 57 (byte) 'O', 58 (byte) 'P', 59 (byte) 'Q', 60 (byte) 'R', 61 (byte) 'S', 62 (byte) 'T', 63 (byte) 'U', 64 (byte) 'V', 65 (byte) 'W', 66 (byte) 'X', 67 (byte) 'Y', 68 (byte) 'Z', 69 (byte) 'a', 70 (byte) 'b', 71 (byte) 'c', 72 (byte) 'd', 73 (byte) 'e', 74 (byte) 'f', 75 (byte) 'g', 76 (byte) 'h', 77 (byte) 'i', 78 (byte) 'j', 79 (byte) 'k', 80 (byte) 'l', 81 (byte) 'm', 82 (byte) 'n', 83 (byte) 'o', 84 (byte) 'p', 85 (byte) 'q', 86 (byte) 'r', 87 (byte) 's', 88 (byte) 't', 89 (byte) 'u', 90 (byte) 'v', 91 (byte) 'w', 92 (byte) 'x', 93 (byte) 'y', 94 (byte) 'z', 95 (byte) '0', 96 (byte) '1', 97 (byte) '2', 98 (byte) '3', 99 (byte) '4', 100 (byte) '5', 101 (byte) '6', 102 (byte) '7', 103 (byte) '8', 104 (byte) '9', 105 (byte) '+', 106 (byte) '/' }; 107 Base64EncMap = map; 108 Base64DecMap = new byte[128]; 109 for (int idx = 0; idx < Base64EncMap.length; idx++) { 110 Base64DecMap[Base64EncMap[idx]] = (byte) idx; 111 } 112 } 113 114 121 public final static byte[] base64Decode(byte[] data) { 122 if (data == null) { 123 return null; 124 } 125 126 int tail = data.length; 127 while (data[tail - 1] == '=') { 128 tail--; 129 } 130 131 byte dest[] = new byte[tail - data.length / 4]; 132 133 for (int idx = 0; idx < data.length; idx++) { 135 data[idx] = Base64DecMap[data[idx]]; 136 } 137 138 int sidx, didx; 140 for (sidx = 0, didx = 0; didx < dest.length - 2; sidx += 4, didx += 3) { 141 dest[didx] = (byte) (((data[sidx] << 2) & 255) | ((data[sidx + 1] >>> 4) & 003)); 142 dest[didx + 1] = (byte) (((data[sidx + 1] << 4) & 255) | ((data[sidx + 2] >>> 2) & 017)); 143 dest[didx + 2] = (byte) (((data[sidx + 2] << 6) & 255) | (data[sidx + 3] & 077)); 144 } 145 if (didx < dest.length) { 146 dest[didx] = (byte) (((data[sidx] << 2) & 255) | ((data[sidx + 1] >>> 4) & 003)); 147 } 148 if (++didx < dest.length) { 149 dest[didx] = (byte) (((data[sidx + 1] << 4) & 255) | ((data[sidx + 2] >>> 2) & 017)); 150 } 151 152 return dest; 153 } 154 155 162 public final static String base64Decode(String str) { 163 if (str == null) { 164 return null; 165 } 166 167 byte data[] = new byte[str.length()]; 168 data = str.getBytes(); 169 return new String (base64Decode(data)); 170 } 171 172 179 public final static byte[] base64Encode(byte[] data) { 180 if (data == null) { 181 return null; 182 } 183 184 int sidx, didx; 185 byte dest[] = new byte[((data.length + 2) / 3) * 4]; 186 187 for (sidx = 0, didx = 0; sidx < data.length - 2; sidx += 3) { 189 dest[didx++] = Base64EncMap[(data[sidx] >>> 2) & 077]; 190 dest[didx++] = Base64EncMap[(data[sidx + 1] >>> 4) & 017 | (data[sidx] << 4) & 077]; 191 dest[didx++] = Base64EncMap[(data[sidx + 2] >>> 6) & 003 | (data[sidx + 1] << 2) & 077]; 192 dest[didx++] = Base64EncMap[data[sidx + 2] & 077]; 193 } 194 if (sidx < data.length) { 195 dest[didx++] = Base64EncMap[(data[sidx] >>> 2) & 077]; 196 if (sidx < data.length - 1) { 197 dest[didx++] = Base64EncMap[(data[sidx + 1] >>> 4) & 017 | (data[sidx] << 4) & 077]; 198 dest[didx++] = Base64EncMap[(data[sidx + 1] << 2) & 077]; 199 } else 200 dest[didx++] = Base64EncMap[(data[sidx] << 4) & 077]; 201 } 202 203 for (; didx < dest.length; didx++) { 205 dest[didx] = (byte) '='; 206 } 207 208 return dest; 209 } 210 211 218 public final static String base64Encode(String str) { 219 if (str == null) { 220 return null; 221 } 222 byte data[] = new byte[str.length()]; 223 224 data = str.getBytes(); 225 return new String (base64Encode(data)); 226 } 227 } 228 | Popular Tags |