package com.ztspeech.simutalk2.weibo;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
public class XmlBase64 {
static final char[] charTab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_/".toCharArray();
public static String encode(byte[] data) {
return encode(data, 0, data.length, null).toString();
}
public static String utf8_decode(byte[] bytes, int start, int len) {
StringBuffer s = new StringBuffer();
for (int i = start; i < start + len;) {
byte b = bytes[i++];
if ((b >> 7) == 0)
s.append((char) b);
else if ((b >> 5) == (byte) 0xfe)
s.append((char) (((b & 0x1f) << 6) | (bytes[i++] & 0x3f)));
else if ((b >> 4) == (byte) 0xfe)
s.append((char) (((b & 0xf) << 12) | ((bytes[i++] & 0x3f) << 6) | (bytes[i++] & 0x3f)));
}
return new String(s);
}
/**
* Encodes the part of the given byte array denoted by start and len to the
* Base64 format. The encoded data is appended to the given StringBuffer. If
* no StringBuffer is given, a new one is created automatically. The
* StringBuffer is the return value of this method.
*/
public static StringBuffer encode(byte[] data, int start, int len, StringBuffer buf) {
if (buf == null)
buf = new StringBuffer(data.length * 3 / 2);
int end = len - 3;
int i = start;
while (i <= end) {
int d;
int d1, d2, d3;
if (data[i] < 0)
d1 = (int) (data[i] + 256);
else
d1 = (int) (data[i]);
if (data[i + 1] < 0)
d2 = (int) (data[i + 1] + 256);
else
d2 = (int) (data[i + 1]);
if (data[i + 2] < 0)
d3 = (int) (data[i + 2] + 256);
else
d3 = (int) (data[i + 2]);
d = (((d1) & 0x0ff) << 16) | (((d2) & 0x0ff) << 8) | ((d3) & 0x0ff);
buf.append(charTab[(d >> 18) & 63]);
buf.append(charTab[(d >> 12) & 63]);
buf.append(charTab[(d >> 6) & 63]);
buf.append(charTab[d & 63]);
i += 3;
}
if (i == start + len - 2) {
int d;
int d1, d2;
if (data[i] < 0)
d1 = (int) (data[i] + 256);
else
d1 = (int) (data[i]);
if (data[i + 1] < 0)
d2 = (int) (data[i + 1] + 256);
else
d2 = (int) (data[i + 1]);
d = (((d1) & 0x0ff) << 16) | (((d2) & 255) << 8);
buf.append(charTab[(d >> 18) & 63]);
buf.append(charTab[(d >> 12) & 63]);
buf.append(charTab[(d >> 6) & 63]);
buf.append("=");
} else if (i == start + len - 1) {
int d;
int d1;
if (data[i] < 0)
d1 = (int) (data[i] + 256);
else
d1 = (int) (data[i]);
d = ((d1) & 0x0ff) << 16;
buf.append(charTab[(d >> 18) & 63]);
buf.append(charTab[(d >> 12) & 63]);
buf.append("==");
}
return buf;
}
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("unexpected 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();
decode(s, bos);
return bos.toByteArray();
}
public static void decode(String s, ByteArrayOutputStream bos) {
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)));
bos.write((tri >> 16) & 255);
if (s.charAt(i + 2) == '=')
break;
bos.write((tri >> 8) & 255);
if (s.charAt(i + 3) == '=')
break;
bos.write(tri & 255);
i += 4;
}
}
public static boolean needBase64(String s) {
byte[] buff = null;
if (s.length() > 2) {
if (s.substring(0, 2).equals("=?"))
return true;
}
try {
buff = s.getBytes("UTF8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < buff.length; i++) {
if (buff[i] >= 0x20 && buff[i] <= 0x7f && buff[i] != '<' && buff[i] != '>' && buff[i] != '&'
&& buff[i] != '\'' && buff[i] != '"')
continue;
return true;
}
return false;
}
// public static void main(String args[]) throws Exception {
// // String s = new String(new
// // String("�ܽ���").getBytes("IS08859-1"),"UTF-8");
// // String s = new String("�ܽ���".getBytes(),"UTF-8");
// byte[] a = "�̽���".getBytes();
// // new String(b,"utf-8")
// // for(int i=0;i<a.length;i++)
// // {
// // a[i] = 256 + a[i];
// // }
// String sEncode = encode(a);
// System.out.println("sEncode:" + sEncode);
// byte[] str = decode(sEncode);
//
// System.out.println("decode:" + new String(str));
// /*
// * String s2 = new String(new String("�ܽ���").getBytes()); byte[]a2 =
// * s2.getBytes(); String sEncode2 = encode(s2.getBytes());
// */
//
// byte[] b = sEncode.getBytes();
// System.out.println("b:" + new String(b));
// /*
// * String queryKeyword = new String(b); String sName = new
// * String(b,"utf-8");
// *
// * System.out.println(queryKeyword); System.out.println(sName);
// * System.out.println("over");
// */
// // byte[] b3 = decode("54yu5LiWTGl2ZSjlkajmnbDkvKYp");
// byte[] b3 = decode("54ix");
//
// System.out.println(new String(b3, "utf-8"));
// System.out.println(new String(b3));
// }
}