http://javaalmanac.com/egs/java.net/Base64.html
解决方案 »
- unsupported encoding cp1386
- 在HQL中用聚集函数查询的问题
- 将数据库的值查询出来后怎么方到数组里啊 !!!!
- java IO如何完整读取一个文本文件
- 用Jar打包了一组JAVA程序,但是用Java命令运行时却提示“没有主清单属性”
- public static void main(String args[]){...},父类与子类同时定义有这样的main方法,但在子类中运行main时,程序却跑到父类的main中执
- 我用的VisualCafe不能显示中文,怎么回事呀?
- applet waiting online
- 一个关于java获取URL源代码的问题
- _____俺像学JAVA,请高手们提提建议!!!!!!_________
- 求最新jdk下载地址。要求1。4。2 在线等
- 关于80端口监控(谁有好的解决方法,如采用,马上开贴送分)
这个事我实现的Base64编码器,应该有大优化的余地,但是功能没问题,
在各大邮件服务器测试过 支持中英文的Base64编码解码器 开发者:王飞平
[email protected] Base64 字符表
码值 字符 码值 字符 码值 字符 码值 字符
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
*/
import java.io.*;public class Base64{
public static char BASETABLE[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/','='}; public static String encode(String text){
/*编码算法
1.将数据按3个字节一组分成数块;
2.每块将3个8位的数据转换成4个6位数据段;
11111111 00000000 11111111 ---- 111111 110000 000011 111111
3.根据Base64字符表得到4个6位数据段对应的字符;
4.如果最后一块只有两个字节,则添加两个0位,转换成对应Base64字符表的三个字符,并在结尾添一个'='字符;
如果最后一块只有一个字节,则添加四个0位,转换成对应Base64字符表的两个字符,并在结尾添两个'='字符。
*/
StringBuffer code=new StringBuffer();
byte[] textBytes=text.getBytes();
int textLength=textBytes.length;
int blockCount=(int)textLength/3;
//char[] textChars=new char[textLength];
int ch, bits, textChars[]=new int[textLength];
//text.getChars(0, textLength, textChars, 0); for(int i=0;i<textLength;i++)
textChars[i]=textBytes[i]>=0 ? textBytes[i] : 256+(int)textBytes[i]; for(int i=0;i<blockCount;i++){
ch=(int)textChars[0+i*3];
ch=ch>>>2;
code.append(BASETABLE[ch]);
bits=(int)textChars[0+i*3]-ch*4;
ch=(int)textChars[1+i*3];
ch=ch>>>4;
code.append(BASETABLE[ch+bits*16]);
bits=(int)textChars[1+i*3]-ch*16;
ch=(int)textChars[2+i*3];
ch=ch>>>6;
code.append(BASETABLE[ch+bits*4]);
bits=(int)textChars[2+i*3]-ch*64;
code.append(BASETABLE[bits]);
}
if((textLength % 3)!=0)
{ ch=(int)textChars[blockCount*3];
ch=ch>>>2;
code.append(BASETABLE[ch]);
bits=(int)textChars[blockCount*3]-ch*4;
switch(textLength % 3){
case 1: code.append(BASETABLE[bits*16]);
code.append(BASETABLE[64]);
code.append(BASETABLE[64]);
break;
case 2: ch=(int)textChars[1+blockCount*3];
ch=ch>>>4;
code.append(BASETABLE[ch+bits*16]);
bits=(int)textChars[1+blockCount*3]-ch*16;
code.append(BASETABLE[bits*4]);
code.append(BASETABLE[64]);
break;
}
} return code.toString();
} public static String decode(String code){
/*解码算法
1.将数据按4个字节一组分成数块;
2.每块将4个字符去掉最高两位并转换成3个8位的数据段;
注意:数据块中的字符取值不是ASCII集的值,而是Base64字符表中相对应的索引值!
00 111111 00 110000 00 000011 00 111111 ---- 11111111 00000000 11111111
3.根据ASCII字符集得到3个8位数据段对应的字符;
4.如果最后一块只有两个'=',去掉两个'=',并去掉最低两位,转换成对应ASSCII字符集的两个字符;
如果最后一块只有一个'=',去掉'=',并去掉最低四位,转换成对应ASSCII字符集的一个字符。
*/
//StringBuffer text=new StringBuffer();
int codeLength=code.length();
int blockCount=(int)codeLength/4;
char[] codeChars=new char[codeLength];
int ch, bits;
code.getChars(0, codeLength, codeChars, 0); byte[] textBytes;
if(codeChars[codeLength-2]=='=') textBytes=new byte[codeLength/4*3-2];
else if(codeChars[codeLength-1]=='=') textBytes=new byte[codeLength/4*3-1];
else textBytes=new byte[codeLength/4*3];
for(int i=0;i<blockCount;i++){
bits=indexOfBase64Table(codeChars[1+i*4])>>>4;
ch=indexOfBase64Table(codeChars[0+i*4]);
textBytes[0+i*3]=(byte)(ch>=32 ? (32-ch)*4-bits : ch*4+bits);
if(codeChars[2+i*4]!='='){
ch=indexOfBase64Table(codeChars[1+i*4])-bits*16;
bits=indexOfBase64Table(codeChars[2+i*4])>>>2;
if(ch>=8) ch=(8-ch)*16-bits;
else ch=ch*16+bits;
textBytes[1+i*3]=(byte)ch;
//text.append((char)ch);
if(codeChars[3+i*4]!='='){
//ch=(indexOfBase64Table(codeChars[2+i*4])-bits*4)*64+indexOfBase64Table(codeChars[3+i*4]);
ch=indexOfBase64Table(codeChars[2+i*4])-bits*4;
if(ch>=2) ch=(2-ch)*64-indexOfBase64Table(codeChars[3+i*4]);
else ch=ch*64+indexOfBase64Table(codeChars[3+i*4]);
//text.append((char)ch);
textBytes[2+i*3]=(byte)ch;
}
}
} for(int i=0;i<textBytes.length;i++)
if(textBytes[i]<0) textBytes[i]=(byte)(-128-(int)textBytes[i]);
//return text.toString(); String text=null;
try{
text=new String(textBytes,"gb2312");
}catch(UnsupportedEncodingException e){} return text;
} private static int indexOfBase64Table(char ch){
for(int i=0;i<64;i++) if(ch==BASETABLE[i]) return i;
return -1;
}
}