概念

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。

示例一

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version></dependency>

publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{Stringstr="PERJVj53d2RhZGZhZGYgYXNkZmFzZiBhc2Zhc2QgZnNhZGZmYTwvRElWPg==";StringdecodeStr=newString(Base64.decodeBase64(str),"GBK");System.out.println(decodeStr);}

示例二

//项目www.1b23.compublicclassBase64{privatestaticfinalchar[]S_BASE64CHAR={'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','+','/'};privatestaticfinalcharS_BASE64PAD='=';privatestaticfinalbyte[]S_DECODETABLE=newbyte[128];static{for(inti=0;i<S_DECODETABLE.length;i++)S_DECODETABLE[i]=Byte.MAX_VALUE;//127for(inti=0;i<S_BASE64CHAR.length;i++)//0to63S_DECODETABLE[S_BASE64CHAR[i]]=(byte)i;}privatestaticintdecode0(char[]ibuf,byte[]obuf,intwp){intoutlen=3;if(ibuf[3]==S_BASE64PAD)outlen=2;if(ibuf[2]==S_BASE64PAD)outlen=1;intb0=S_DECODETABLE[ibuf[0]];intb1=S_DECODETABLE[ibuf[1]];intb2=S_DECODETABLE[ibuf[2]];intb3=S_DECODETABLE[ibuf[3]];switch(outlen){case1:obuf[wp]=(byte)(b0<<2&0xfc|b1>>4&0x3);return1;case2:obuf[wp++]=(byte)(b0<<2&0xfc|b1>>4&0x3);obuf[wp]=(byte)(b1<<4&0xf0|b2>>2&0xf);return2;case3:obuf[wp++]=(byte)(b0<<2&0xfc|b1>>4&0x3);obuf[wp++]=(byte)(b1<<4&0xf0|b2>>2&0xf);obuf[wp]=(byte)(b2<<6&0xc0|b3&0x3f);return3;default:thrownewRuntimeException("InternalErrror");}}publicstaticbyte[]decode(Stringdata){char[]ibuf=newchar[4];intibufcount=0;byte[]obuf=newbyte[data.length()/4*3+3];intobufcount=0;for(inti=0;i<data.length();i++){charch=data.charAt(i);if(ch==S_BASE64PAD||ch<S_DECODETABLE.length&&S_DECODETABLE[ch]!=Byte.MAX_VALUE){ibuf[ibufcount++]=ch;if(ibufcount==ibuf.length){ibufcount=0;obufcount+=decode0(ibuf,obuf,obufcount);}}}if(obufcount==obuf.length)returnobuf;byte[]ret=newbyte[obufcount];System.arraycopy(obuf,0,ret,0,obufcount);returnret;}

publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{Stringstr="PERJVj53d2RhZGZhZGYgYXNkZmFzZiBhc2Zhc2QgZnNhZGZmYTwvRElWPg==";StringdecodeStr=newString(Base64.decode(str),"GBK");System.out.println(decodeStr);}