/**<br /> * Base64Util for Java<br /> * cheungmine<br /> * 2009-11-8<br /> */<br />public class Base64Util {<br />/**<br /> * @param args<br /> */<br />public static void main(String[] args)<br />{<br />// 源位元組數組<br />int cb = 0;<br />System.out.print("源位元組數組: ");</p><p>byte in[] = new byte[100];<br />in[cb++]='1';<br />in[cb++]='2';<br />in[cb++]='3';<br />in[cb++]='4';<br />in[cb++]='5';</p><p>System.out.write(in, 0, cb);</p><p>// 計算編碼需要的輸出位元組尺寸<br />int cbOut = encodeString( in, cb, null, 0);</p><p>// 為輸出分配數組<br />byte out[] = new byte[cbOut];</p><p>// 開始編碼<br />encodeString( in, cb, out, 0);</p><p>// 輸出編碼內容<br />System.out.print("/n編碼後內容: ");<br />System.out.write(out, 0, cbOut);</p><p>// 計算解碼需要的位元組<br />int cbDec = decodeString(out, cbOut, null);</p><p>// 分配解碼數組<br />byte dec[] = new byte[cbDec];</p><p>// 開始解碼<br />decodeString(out, cbOut, dec);</p><p>// 輸出解碼結果, 這個結果和輸出應該一致<br />System.out.print("/n解碼的結果: ");<br />System.out.write(dec, 0, cbDec);<br />}</p><p>/**<br /> * Translation Table as described in RFC1113<br /> */<br />static String cb64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";<br />/**<br /> * Translation Table to decode (created by author)<br /> */<br />static String cd64="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[//]^_`abcdefghijklmnopq";<br />/**<br /> * encodeBlock<br /> *<br /> * encode 3 8-bit binary bytes (in) as 4 '6-bit' characters (out)<br /> */<br />static void encodeBlock( byte in[], byte out[], int len )<br />{<br />out[0] = (byte) cb64.charAt( in[0] >> 2 );<br /> out[1] = (byte) cb64.charAt( ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) );<br /> out[2] = (byte) (len > 1 ? cb64.charAt( ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ) : '=');<br /> out[3] = (byte) (len > 2 ? cb64.charAt( in[2] & 0x3f ) : '=');<br />}</p><p>/**<br /> * decodeBlock<br /> *<br /> * decode 4 '6-bit' characters into 3 8-bit binary bytes<br /> */<br />static void decodeBlock( byte in[], byte out[] )<br />{<br /> out[ 0 ] = (byte) (in[0] << 2 | in[1] >> 4);<br /> out[ 1 ] = (byte) (in[1] << 4 | in[2] >> 2);<br /> out[ 2 ] = (byte) (((in[2] << 6) & 0xc0) | in[3]);<br />}</p><p>/**<br /> * encodeString<br /> *<br /> * base64 encode bytes<br /> * by cheungmine<br /> * outstr is allocated by caller<br /> * length of encoded string is returned (not including end closing '/0')<br /> */<br />public static int encodeString( byte instr[], int inlen, byte outstr[], int linesize )<br />{<br />byte in[] = new byte[3];<br />byte out[]= new byte[4];</p><p>int inc=0, outc=0, i, len, blocksout = 0;</p><p>/* only size of buffer required */<br />if (outstr==null){<br />if (linesize==0)<br />return (inlen%3==0)? ((inlen/3)*4):((inlen/3+1)*4);<br />while(inc < inlen) {<br />len = 0;<br />for( i = 0; i < 3; i++ ) {<br />if (inc < inlen){<br />len++;<br />inc++;<br />}<br />}<br />if( len>0 ) {<br />outc += 4;<br />blocksout++;<br />}<br />if( blocksout >= (linesize/4) || inc==inlen ) {<br />if( blocksout>0 ) {<br />outc += 2;<br />}<br />blocksout = 0;<br />}<br />}<br />return outc;<br />}<br />/* actual encoding below */<br /> while(inc < inlen) {<br /> len = 0;<br />for( i = 0; i < 3; i++ ) {<br />if (inc < inlen){<br />len++;<br />in[i] = instr[inc++];<br />}<br />else{<br />in[i] = 0; // padding with zero<br />}<br />}<br />if(len > 0) {<br /> encodeBlock( in, out, len );<br /> for( i = 0; i < 4; i++ ) {<br />outstr[outc++] = out[i];<br /> }<br />blocksout++;<br /> }<br />if (linesize > 0){<br />if( blocksout >= (linesize/4) || inc==inlen ) {<br />if(blocksout > 0) {<br />outstr[outc++] = '/r';<br />outstr[outc++] = '/n';<br />}<br />blocksout = 0;<br />}<br />}<br /> }<br />return outc;<br />}</p><p>/**<br /> * add by cheungmine<br /> * 2009-11-1<br /> */<br />public static int decodeString( byte instr[], int inlen, byte outstr[] )<br />{<br /> byte in[]=new byte[4];<br /> byte out[]=new byte[3];<br /> byte v;<br /> int inc=0, outc=0, i, len;<br />/* only size of buffer required */<br />if (outstr==null){<br />while( inc < inlen ) {<br />for( len = 0, i = 0; i < 4 && inc<inlen; i++ ) {<br />v = 0;<br />while( (inc<=inlen) && (v==0) ) {<br />v = (inc < inlen)? instr[inc] : 0;<br />inc++;<br />v = (byte) ((v < 43 || v > 122) ? 0 : cd64.charAt(v-43));<br />if( v>0 ) {<br />v = (byte) ((v == '$') ? 0 : v - 61);<br />}<br />}<br />if( inc<=inlen ) {<br />len++;<br />}<br />}<br />if( len>1 ) {<br />outc += (len-1);<br />}<br />}<br />return outc;<br />}</p><p> while( inc < inlen ) {<br /> for( len = 0, i = 0; i < 4 && inc<inlen; i++ ) {<br /> v = 0;<br /> while( (inc<=inlen) && (v==0) ) {<br />v = (inc < inlen)? instr[inc] : 0;<br />inc++;<br /> v = (byte) ((v < 43 || v > 122) ? 0 : cd64.charAt(v-43));<br /> if( v>0 ) {<br /> v = (byte) ((v == '$') ? 0 : v - 61);<br /> }<br /> }<br />if( inc<=inlen ) {<br /> len++;<br /> if( v>0 ) {<br /> in[ i ] = (byte) (v - 1);<br /> }<br /> }<br /> else {<br /> in[i] = 0;<br /> }<br /> }<br /> if( len>0 ) {<br /> decodeBlock( in, out );<br /> for( i = 0; i < len - 1; i++ ) {<br />outstr[outc++] = out[i];<br /> }<br /> }<br /> }<br />return outc;<br />}<br />}<br />