BASE64的编码以及注意事项

来源:互联网 发布:程序员的算法趣题pdf 编辑:程序博客网 时间:2024/06/08 14:53
package com.example.des1;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;public class Base64 {private static final char[] legalChars = "ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();/** * data[] 进行编码 */public static String encode(byte[] data){int start = 0;int len = data.length;StringBuffer buf = new StringBuffer(data.length * 3 / 2);int end = len - 3;int i = start;int n = 0;while(i <= end){int d = ((((int) data[i]) & 0x00ff) << 16)| ((((int) data[i + 1]) & 0x00ff) << 8)| (((int) data[i + 2]) & 0x00ff );buf.append(legalChars[(d >> 18) & 63]);buf.append(legalChars[(d >> 12) & 63]);buf.append(legalChars[(d >> 6) & 63]);buf.append(legalChars[d & 63]);i += 3;if (n++ >= 14){n = 0;buf.append("");}}if (i == start + len - 2){int d =((((int)data[i]) & 0x00ff) << 16)| ((((int)data[i + 1]) & 255) << 8);buf.append(legalChars[(d >> 18) & 63]);buf.append(legalChars[(d >> 12) & 63]);buf.append(legalChars[(d >> 6) & 63]);buf.append("=");}else if (i == start + len -1){int d = (((int)data[i]) & 0x00ff) << 16 ;buf.append(legalChars[(d >> 18) & 63]);buf.append(legalChars[(d >> 12) & 63]);buf.append("==");}return buf.toString();}private static int decode(char c){if (c >= 'A' && c <= 'Z')return ((int) c) -65;else if (c >='a' && c <= 'z')return((int) c) - 97 + 26;else if (c >= '0' && c <= '9')return ((int) c) -48 + 26 + 26;else switch(c){case '+' :return 62;case '/' :return 63;case '=' :return 0;default:throw new RuntimeException("unexcepted code" + c);}}/**          * Decodes the given Base64 encoded String to a new byte array. The byte          * array holding the decoded data is returned.          */  public static byte[] decode(String s){ByteArrayOutputStream bos = new ByteArrayOutputStream();try {decode(s,bos);}catch(Exception e)                //为何IOException 会报错??????//{//throw new RuntimeException();//}//catch (Exception e) {// TODO Auto-generated catch blockthrow new RuntimeException();}byte[] decodedBytes = bos.toByteArray();try{bos.close();}catch(IOException ex){System.err.println("Error while decoding base64" + ex.toString());}return decodedBytes;}private static void decode(String s, OutputStream os) throws Exception{int i = 0;int len = s.length();while(true){while (i < len && s.charAt(i) <=' ')i++;if (i == len)break;int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12)+ (decode(s.charAt(i + 2)) << 6) + (decode(s.charAt(i + 3)));os.write((tri >> 16) & 255);if (s.charAt(i + 2) == '=')break;os.write((tri >> 8) & 255);if (s.charAt(i + 3) == '=')break;os.write(tri & 255);i += 4;}}}


private static final char[] legalChars = "ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();

 

编程时 红色字体不能改变顺序或者数量,否则不能正常编码,因为索引是按下图的顺序来的。

 

所以任何一点输入差错,都没办法正常运行。

 

 

 BASE64算法原理:点击打开链接

0 0