⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 base64.java

📁 《ajax编程技术与实例》的所有的案例
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
    
    
    
    
    /**
     * 将编码后的数据写入文件
     *
     * @param rawdata The data to write.
     * @param file The file to read.
     * @return Whether or not the write was a success.
     * @since 1.4
     */
    public static boolean encodeToFile( byte[] rawdata, String file )
    {
        return writeFile( rawdata, file, ENCODE );
    }   // end encodeFromFile
    
    
    
    /**
     * 将解码后的数据写入文件
     *
     * @param encdata The data to write.
     * @param file The file to read.
     * @return Whether or not the write was a success.
     * @since 1.4
     */
    public static boolean decodeToFile( byte[] encdata, String file )
    {
        return writeFile( encdata, file, DECODE );
    }   // end encodeFromFile
    
    
    
    
/* ********  D E C O D I N G   M E T H O D S  ******** */
    
    
    /**
     * 对fourBytes数组进行解码,并返回结果数组;
     *
     * @param fourBytes the array with Base64 content
     * @return array with decoded values
     * @since 1.3
     */
    private static byte[] decode4to3( byte[] fourBytes )
    {
        byte[] outBuff1 = new byte[3];
        int    count    = decode4to3( fourBytes, 0, outBuff1, 0 );
        byte[] outBuff2 = new byte[ count ];
        
        for( int i = 0; i < count; i++ )
            outBuff2[i] = outBuff1[i];
        
        return outBuff2;
    }
    
    
    
    
    /**
     * 对source数组进行解码,并将结果写入destination数组。
     * source和destination数组可以通过srcOffset和destOffset来确定起点。
     * 该方法不会对数组大小进行验证,source数组满足srcOffset+3,以及destination数组满足destOffset+4。
     * 
     * @param source the array to convert
     * @param srcOffset the index where conversion begins
     * @param destination the array to hold the conversion
     * @param destOffset the index where output will be put
     * @return the number of decoded bytes converted
     * @since 1.3
     */
    private static int decode4to3( byte[] source, int srcOffset, byte[] destination, int destOffset )
    {
        if( source[ srcOffset + 2] == EQUALS_SIGN )
        {
            int outBuff =   ( ( DECODABET[ source[ srcOffset    ] ] & 0xFF ) << 18 )
                          | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 );
            
            destination[ destOffset ] = (byte)( outBuff >>> 16 );
            return 1;
        }
               
        else if( source[ srcOffset + 3 ] == EQUALS_SIGN )
        {

            int outBuff =   ( ( DECODABET[ source[ srcOffset     ] ] & 0xFF ) << 18 )
                          | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
                          | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) <<  6 );
            
            destination[ destOffset     ] = (byte)( outBuff >>> 16 );
            destination[ destOffset + 1 ] = (byte)( outBuff >>>  8 );
            return 2;
        }
        
        else
        {
            try{
            int outBuff =   ( ( DECODABET[ source[ srcOffset     ] ] & 0xFF ) << 18 )
                          | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
                          | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) <<  6)
                          | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF )      );

            
            destination[ destOffset     ] = (byte)( outBuff >> 16 );
            destination[ destOffset + 1 ] = (byte)( outBuff >>  8 );
            destination[ destOffset + 2 ] = (byte)( outBuff       );

            return 3;
            }catch( Exception e){
                System.out.println(""+source[srcOffset]+ ": " + ( DECODABET[ source[ srcOffset     ] ]  ) );
                System.out.println(""+source[srcOffset+1]+  ": " + ( DECODABET[ source[ srcOffset + 1 ] ]  ) );
                System.out.println(""+source[srcOffset+2]+  ": " + ( DECODABET[ source[ srcOffset + 2 ] ]  ) );
                System.out.println(""+source[srcOffset+3]+  ": " + ( DECODABET[ source[ srcOffset + 3 ] ]  ) );
                return -1;
            }   //end catch
        }
    }   // end decodeToBytes
    
    
    
    /**
     * 调用decode方法进行解码
     *
     * @param s the string to decode
     * @return the decoded data
     * @since 1.4
     */
    public static byte[] decode( String s )
    {   
        byte[] bytes = s.getBytes();
        return decode( bytes, 0, bytes.length );
    }   // end decode
    
    
    /**
     * 对数据进行解码,并将其作为String返回
     * 
     * @param s the strind to decode
     * @return The data as a string
     * @since 1.4
     */
    public static String decodeToString( String s )
    {   return new String( decode( s ) );
    }   // end decodeToString
    
    
    /**
     * 对Base64规范的数据进行解码,并且反串行化得到一个Java对象,如果遇到错误则返回Null
     *
     * @param encodedObject The Base64 data to decode
     * @return The decoded and deserialized object
     * @since 1.4
     */
    public static Object decodeToObject( String encodedObject )
    {
        byte[] objBytes = decode( encodedObject );
        
        java.io.ByteArrayInputStream bais = null;
        java.io.ObjectInputStream    ois  = null;
        
        try
        {
            bais = new java.io.ByteArrayInputStream( objBytes );
            ois  = new java.io.ObjectInputStream( bais );
        
            return ois.readObject();
        }   // end try
        catch( java.io.IOException e )
        {
            e.printStackTrace();
            return null;
        }   // end catch
        catch( java.lang.ClassNotFoundException e )
        {
            e.printStackTrace();
            return null;
        }   // end catch
        finally
        {
            try{ bais.close(); } catch( Exception e ){}
            try{ ois.close();  } catch( Exception e ){}
        }   // end finally
    }   // end decodeObject
    
    
    /**
     * 按照字节数组的格式对Base64规范的内容进行解码,并且返回解码后的字节数组;
     *
     * @param source The Base64 encoded data
     * @param off    The offset of where to begin decoding
     * @param len    The length of characters to decode
     * @return decoded data
     * @since 1.3
     */
    public static byte[] decode( byte[] source, int off, int len )
    {
        int    len34   = len * 3 / 4;
        byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output
        int    outBuffPosn = 0;
        
        byte[] b4        = new byte[4];
        int    b4Posn    = 0;
        int    i         = 0;
        byte   sbiCrop   = 0;
        byte   sbiDecode = 0;
        for( i = 0; i < len; i++ )
        {
            sbiCrop = (byte)(source[i] & 0x7f); // Only the low seven bits
            sbiDecode = DECODABET[ sbiCrop ];
            
            if( sbiDecode >= WHITE_SPACE_ENC ) // White space, Equals sign or better
            {
                if( sbiDecode >= EQUALS_SIGN_ENC )
                {
                    b4[ b4Posn++ ] = sbiCrop;
                    if( b4Posn > 3 )
                    {
                        outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn );
                        b4Posn = 0;
                        
                        // If that was the equals sign, break out of 'for' loop
                        if( sbiCrop == EQUALS_SIGN )
                            break;
                    }   // end if: quartet built
                    
                }   // end if: equals sign or better
                
            }   // end if: white space, equals sign or better
            else
            {
                System.err.println( "Bad Base64 input character at " + i + ": " + source[i] + "(decimal)" );
                return null;
            }   // end else: 
        }   // each input character
                                   
        byte[] out = new byte[ outBuffPosn ];
        System.arraycopy( outBuff, 0, out, 0, outBuffPosn ); 
        return out;
    }   // end decode
    
    
    
    
    /* ********  I N N E R   C L A S S   I N P U T S T R E A M  ******** */
    
    
    
    /**
     * 定义一个InputStream类,用来读取数据。
     * 
     * @see Base64
     * @see java.io.FilterInputStream
     * @since 1.3
     */
    public static class InputStream extends java.io.FilterInputStream
    {
        private boolean encode;         // Encoding or decoding
        private int     position;       // Current position in the buffer
        private byte[]  buffer;         // Small buffer holding converted data
        private int     bufferLength;   // Length of buffer (3 or 4)
        private int     numSigBytes;    // Number of meaningful bytes in the buffer
        private int     lineLength;
        private boolean breakLines;     // Break lines at less than 80 characters
        
        
        /**
         * 构造一个解码模式的类对象;
         * 
         * @param in the {@link java.io.InputStream} from which to read data.
         * @since 1.3
         */
        public InputStream( java.io.InputStream in )
        {   
            this( in, Base64.DECODE );
        }   // end constructor
        
        
        /**
         * 根据encode参数来判断该对象采用的模式;
         * 
         * @param in the {@link java.io.InputStream} from which to read data.
         * @param encode Conversion direction
         * @see Base64#ENCODE
         * @see Base64#DECODE
         * @since 1.3
         */
        public InputStream( java.io.InputStream in, boolean encode )
        {
            this( in, encode, true );
        }   // end constructor
        
        
        /**
         * 根据encode参数判断该类对象是编码模式还是解码模式,breakLines参数会将每行所包含的字符不超过80
         * 
         * @param in the {@link java.io.InputStream} from which to read data.
         * @param encode Conversion direction
         * @param breakLines Break lines at less than 80 characters.
         * @see Base64#ENCODE
         * @see Base64#DECODE
         * @since 1.3
         */
        public InputStream( java.io.InputStream in, boolean encode, boolean breakLines )
        {   
            super( in );
            this.breakLines = breakLines;
            this.encode = encode;
            this.bufferLength = encode ? 4 : 3;
            this.buffer   = new byte[ bufferLength ];
            this.position = -1;
            this.lineLength = 0;
        }   // end constructor
        
        /**
         * 从输入流中读取足够的数据来进行Base64规范的编码或解码,并且返回下一个字节。
         * 
         * @return next byte
         * @since 1.3
         */
        public int read() throws java.io.IOException 
        { 
            // Do we need to get data?
            if( position < 0 )
            {
                if( encode )
                {
                    byte[] b3 = new byte[3];
                    int numBinaryBytes = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -