java base64加解密

import java.io.*;

public
class Base64 {

     public Base64() {
     }
 
    public static String encode(String data) {
         return new String(encode(data.getBytes()));
     }
 
    public static String decode(String data) {
         return new String(decode(data.toCharArray()));
     }
 
    public static char [] encode( byte [] data) {
         char [] out = new char [((data.length + 2 ) / 3 ) * 4 ];
         for ( int i = 0 , index = 0 ; i < data.length; i += 3 , index += 4 ) {
             boolean quad = false ;
             boolean trip = false ;
 
             int val = ( 0xFF & ( int ) data[i]);
             val <<= 8 ;
             if ((i + 1 ) < data.length) {
                 val |= ( 0xFF & ( int ) data[i + 1 ]);
                 trip = true ;
             }
             val <<= 8 ;
             if ((i + 2 ) < data.length) {
                 val |= ( 0xFF & ( int ) data[i + 2 ]);
                 quad = true ;
             }
             out[index + 3 ] = alphabet[(quad ? (val & 0x3F ) : 64 )];
             val >>= 6 ;
             out[index + 2 ] = alphabet[(trip ? (val & 0x3F ) : 64 )];
             val >>= 6 ;
             out[index + 1 ] = alphabet[val & 0x3F ];
             val >>= 6 ;
             out[index + 0 ] = alphabet[val & 0x3F ];
         }
         return out;
     }
 
    public static byte [] decode( char [] data) {
 
         int tempLen = data.length;
         for ( int ix = 0 ; ix < data.length; ix++) {
             if ((data[ix] > 255 ) || codes[data[ix]] < 0 ) {
                 --tempLen; // ignore non-valid chars and padding
             }
         }
 
         int len = (tempLen / 4 ) * 3 ;
         if ((tempLen % 4 ) == 3 ) {
             len += 2 ;
         }
         if ((tempLen % 4 ) == 2 ) {
             len += 1 ;
 
         }
         byte [] out = new byte [len];
 
         int shift = 0
         int accum = 0
         int index = 0 ;
 
       
         for ( int ix = 0 ; ix < data.length; ix++) {
             int value = (data[ix] > 255 ) ? - 1 : codes[data[ix]];
 
             if (value >= 0 ) { // skip over non-code
                 accum <<= 6 ; // bits shift up by 6 each time thru
                 shift += 6 ; // loop, with new bits being put in
                 accum |= value; // at the bottom.
                 if (shift >= 8 ) { // whenever there are 8 or more shifted in,
                     shift -= 8 ; // write them out (from the top, leaving any
                     out[index++] = // excess at the bottom for next iteration.
                     ( byte ) ((accum >> shift) & 0xff );
                 }
             }
         }
 
       
         if (index != out.length) {
             throw new Error( "Miscalculated data length (wrote " + index
                     + " instead of " + out.length + ")" );
         }
 
         return out;
     }
 
   

     public static void encode(File file) throws IOException {
         if (!file.exists()) {
             System.exit( 0 );
         }
 
         else {
             byte [] decoded = readBytes(file);
             char [] encoded = encode(decoded);
             writeChars(file, encoded);
         }
         file = null ;
     }
 
   

     public static void decode(File file) throws IOException {
         if (!file.exists()) {
             System.exit( 0 );
         } else {
             char [] encoded = readChars(file);
             byte [] decoded = decode(encoded);
             writeBytes(file, decoded);
         }
         file = null ;
     }
 
   

     private static char [] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
             .toCharArray();
 
   

     private static byte [] codes = new byte [ 256 ];
     static {
         for ( int i = 0 ; i < 256 ; i++) {
             codes[i] = - 1 ;
             // LoggerUtil.debug(i + "&" + codes[i] + " ");
         }
         for ( int i = 'A' ; i <= 'Z' ; i++) {
             codes[i] = ( byte ) (i - 'A' );
             // LoggerUtil.debug(i + "&" + codes[i] + " ");
         }
 
         for ( int i = 'a' ; i <= 'z' ; i++) {
             codes[i] = ( byte ) ( 26 + i - 'a' );
             // LoggerUtil.debug(i + "&" + codes[i] + " ");
         }
         for ( int i = '0' ; i <= '9' ; i++) {
             codes[i] = ( byte ) ( 52 + i - '0' );
             // LoggerUtil.debug(i + "&" + codes[i] + " ");
         }
         codes[ '+' ] = 62 ;
         codes[ '/' ] = 63 ;
     }
 
     private static byte [] readBytes(File file) throws IOException {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         byte [] b = null ;
         InputStream fis = null ;
         InputStream is = null ;
         try {
             fis = new FileInputStream(file);
             is = new BufferedInputStream(fis);
             int count = 0 ;
             byte [] buf = new byte [ 16384 ];
             while ((count = is.read(buf)) != - 1 ) {
                 if (count > 0 ) {
                     baos.write(buf, 0 , count);
                 }
             }
             b = baos.toByteArray();
 
         } finally {
             try {
                 if (fis != null )
                     fis.close();
                 if (is != null )
                     is.close();
                 if (baos != null )
                     baos.close();
             } catch (Exception e) {
                 System.out.println(e);
             }
         }
 
         return b;
     }
 
     private static char [] readChars(File file) throws IOException {
         CharArrayWriter caw = new CharArrayWriter();
         Reader fr = null ;
         Reader in = null ;
         try {
             fr = new FileReader(file);
             in = new BufferedReader(fr);
             int count = 0 ;
             char [] buf = new char [ 16384 ];
             while ((count = in.read(buf)) != - 1 ) {
                 if (count > 0 ) {
                     caw.write(buf, 0 , count);
                 }
             }
 
         } finally {
             try {
                 if (caw != null )
                     caw.close();
                 if (in != null )
                     in.close();
                 if (fr != null )
                     fr.close();
             } catch (Exception e) {
                 System.out.println(e);
             }
         }
 
         return caw.toCharArray();
     }
 
     private static void writeBytes(File file, byte [] data) throws IOException {
         OutputStream fos = null ;
         OutputStream os = null ;
         try {
             fos = new FileOutputStream(file);
             os = new BufferedOutputStream(fos);
             os.write(data);
 
         } finally {
             try {
                 if (os != null )
                     os.close();
                 if (fos != null )
                     fos.close();
             } catch (Exception e) {
                 System.out.println(e);
             }
         }
     }
 
     private static void writeChars(File file, char [] data) throws IOException {
         Writer fos = null ;
         Writer os = null ;
         try {
             fos = new FileWriter(file);
             os = new BufferedWriter(fos);
             os.write(data);
 
         } finally {
             try {
                 if (os != null )
                     os.close();
                 if (fos != null )
                     fos.close();
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
     }
 
   

 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值