- Timestamp:
- 09/20/11 05:35:22 (8 months ago)
- Branch:
- default
- Convert:
- svn:7c3792e6-d75b-4784-96a6-b298f655ee64/trunk@2786
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kraken-xmlrpc/src/main/java/org/krakenapps/xmlrpc/XmlUtil.java
r2 r352 147 147 return sw.toString(); 148 148 } 149 150 private static byte[] encodeMap = new byte[64]; 151 private static byte[] decodeMap = new byte[128]; 152 static { 153 int i = 0; 154 byte b = 'A'; 155 for (; i < 26; i++) { 156 encodeMap[i] = b; 157 decodeMap[b++] = (byte) i; 158 } 159 b = 'a'; 160 for (; i < 52; i++) { 161 encodeMap[i] = b; 162 decodeMap[b++] = (byte) i; 163 } 164 b = '0'; 165 for (; i < 62; i++) { 166 encodeMap[i] = b; 167 decodeMap[b++] = (byte) i; 168 } 169 encodeMap[62] = '+'; 170 decodeMap['+'] = 62; 171 encodeMap[63] = '/'; 172 decodeMap['/'] = 63; 173 } 174 175 public static byte[] encodeBase64(byte[] bytes) { 176 byte[] result = new byte[(bytes.length + 2) / 3 * 4]; 177 for (int i = 0; i < (bytes.length + 2) / 3; i++) { 178 byte a = bytes[i * 3]; 179 byte b = (i * 3 + 1 < bytes.length) ? bytes[i * 3 + 1] : 0; 180 byte c = (i * 3 + 2 < bytes.length) ? bytes[i * 3 + 2] : 0; 181 182 long l = (a & 0xFF) << 16 | (b & 0xFF) << 8 | (c & 0xFF); 183 for (int j = 3; j >= 0; j--) { 184 result[i * 4 + j] = encodeMap[(int) (l & 0x3F)]; 185 l >>= 6; 186 } 187 } 188 if (bytes.length % 3 == 2) 189 result[result.length - 1] = '='; 190 else if (bytes.length % 3 == 1) 191 result[result.length - 2] = result[result.length - 1] = '='; 192 return result; 193 } 194 195 public static byte[] decodeBase64(byte[] bytes) { 196 int len = bytes.length / 4 * 3; 197 if (bytes[bytes.length - 1] == '=') 198 len--; 199 if (bytes[bytes.length - 2] == '=') 200 len--; 201 202 byte[] result = new byte[len]; 203 for (int i = 0; i < bytes.length / 4; i++) { 204 byte a = decodeMap[bytes[i * 4]]; 205 byte b = decodeMap[bytes[i * 4 + 1]]; 206 byte c = decodeMap[bytes[i * 4 + 2]]; 207 byte d = decodeMap[bytes[i * 4 + 3]]; 208 209 long l = (a & 0x3F) << 18 | (b & 0x3F) << 12 | (c & 0x3F) << 6 | (d & 0x3F); 210 for (int j = 2; j >= 0; j--) { 211 if (i * 3 + j < result.length) 212 result[i * 3 + j] = (byte) (l & 0xFF); 213 l >>= 8; 214 } 215 } 216 return result; 217 } 149 218 }
Note: See TracChangeset
for help on using the changeset viewer.
