Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
 
 
 package org.apache.cxf.common.util;

Base64Utility - this static class provides useful base64 encoding utilities.

Author(s):
Darach Ennis
Craig Ryan
 
 
 // Java imports
 import java.io.Writer;
 
This class converts to/from base64. The alternative conversions include: encode: byte[] into String byte[] into char[] byte[] into OutStream byte[] into Writer decode: char[] into byte[] String into byte[] char[] into OutStream String into OutStream
 
 public final class Base64Utility {
     
     private static final Logger LOG = LogUtils.getL7dLogger(Base64Utility.class);
 
     
     // base 64 character set
     //
     private static final char[] BCS = {
         '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''+''/'
     };
 
     // base 64 wadding
     private static final char PAD = '=';
 
     // size of base 64 decode table
     private static final int BDTSIZE = 128;
 
     // base 64 decode table  
     private static final byte[] BDT = new byte[128];
 
     
     private static final int PAD_SIZE0 = 1;
     private static final int PAD_SIZE4 = 2;
     private static final int PAD_SIZE8 = 3;
     
     // class static intializer for building decode table
     static {
         for (int i = 0;  i < ;  i++) {
             [i] = .;
         }
 
         for (int i = 0;  i < .;  i++) {
             [[i]] = (byte)i;
         }
     }
     
     
     private Base64Utility() {
         //utility class, never constructed
    }
    
    
The decode_chunk routine decodes a chunk of data into its native encoding. base64 encodes each 3 octets of data into 4 characters from a limited 64 character set. The 3 octets are joined to form 24 bits which are then split into 4 x 6bit values. Each 6 bit value is then used as an index into the 64 character table of base64 chars. If the total data length is not a 3 octet multiple the '=' char is used as padding for the final 4 char group, either 1 octet + '==' or 2 octets + '='.

Parameters:
id The input data to be processed
o The offset from which to begin processing
l The length (bound) at which processing is to end
Returns:
The decoded data
Throws:
Base64Exception Thrown is processing fails due to formatting exceptions in the encoded data
    public static byte[] decodeChunk(char[] id,
                                     int o,
                                     int l
        throws Base64Exception {
        
        // Keep it simple - must be >= 4. Unpadded
        // base64 data contain < 3 octets is invalid.
        //
        if ((l - o) < 4) {
            return null;
        }
        char[] ib = new char[4];
        int ibcount = 0;
        // cryan. Calc the num of octets. Each 4 chars of base64 chars
        // (representing 24 bits) encodes 3 octets. 
        //
        int octetCount = 3 * (l / 4);
        // Final 4 chars may contain 3 octets or padded to contain
        // 1 or 2 octets.
        //
        if (id[l - 1] == ) {
            // TT== means last 4 chars encode 8 bits (ie subtract 2)
            // TTT= means last 4 chars encode 16 bits (ie subtract 1)
            octetCount -= (id[l - 2] == ) ? 2 : 1;
        }
        byte[] ob = new byte[octetCount];
        int obcount = 0;
        for (int i = o;  i < o + l && i < id.length;  i++) {
            if (id[i] == 
                || id[i] < .
                && [id[i]] != .) {
                
                ib[ibcount++] = id[i];
                // Decode each 4 char sequence.
                //
                if (ibcount == ib.length) {
                    ibcount = 0;
                    obcount += processEncodeme(ibobobcount);
                }
            }
        }
        
        if (obcount != ob.length) {
            byte []tmp = new byte[obcount];
            System.arraycopy(ob, 0, tmp, 0, obcount);
            ob = tmp;
        }
        return ob;
    }
    public static byte[] decode(String idthrows Base64Exception {
        char[] cd = id.toCharArray();
        return decodeChunk(cd, 0, cd.length);
    }
    public static void decode(char[] id,
                             int o,
                             int l,
                             OutputStream ostream
        throws Base64Exception {
        try {
            ostream.write(decodeChunk(idol));
        } catch (IOException e) {
            // convert exception to Base64Exception
            throw new Base64Exception(new Message("BASE64_RUNTIME_EXCEPTION"), e);
        }
    }
    public static void decode(String id,
                              OutputStream ostream
        throws Base64Exception {
        
        try {
            char[] cd = id.toCharArray();
            ostream.write(decodeChunk(cd, 0, cd.length));
        } catch (IOException e) {
            throw new Base64Exception(new Message("BASE64_DECODE_IOEXCEPTION"), e);
        }
    }
    // Returns base64 representation of specified byte array.
    //
    public static String encode(byte[] id) {
        char[] cd = encodeChunk(id, 0, id.length);
        return new String(cd, 0, cd.length);
    }
    // Returns base64 representation of specified byte array.
    //
    public static char[] encodeChunk(byte[] id,
                                     int o,
                                     int l) {
        if (l <= 0) {
            return null;
        }
        char[] out;
        // If not a multiple of 3 octets then a final padded 4 char
        // slot is needed.
        //
        if ((l - o) % 3 == 0) {
            out = new char[l / 3 * 4];
        } else {
            out = new char[l / 3 * 4 + 4];
        }
        int rindex = o;
        int windex = 0;
        int rest = l - o;
        while (rest >= 3) {
            int i = ((id[rindex] & 0xff) << 16)
                    + ((id[rindex + 1] & 0xff) << 8)
                    + (id[rindex + 2] & 0xff);
            out[windex++] = [i >> 18];
            out[windex++] = [(i >> 12) & 0x3f];
            out[windex++] = [(i >> 6) & 0x3f];
            out[windex++] = [i & 0x3f];
            rindex += 3;
            rest -= 3;
        }
        if (rest == 1) {
            int i = id[rindex] & 0xff;
            out[windex++] = [i >> 2];
            out[windex++] = [(i << 4) & 0x3f];
            out[windex++] = ;
            out[windex++] = ;
        } else if (rest == 2) {
            int i = ((id[rindex] & 0xff) << 8) + (id[rindex + 1] & 0xff);
            out[windex++] = [i >> 10];
            out[windex++] = [(i >> 4) & 0x3f];
            out[windex++] = [(i << 2) & 0x3f];
            out[windex++] = ;
        }
        return out;
    }
    //
    // Outputs base64 representation of the specified byte array 
    // to a byte stream.
    //
    public static void encodeChunk(byte[] id,
                                   int o,
                                   int l,
                                   OutputStream ostreamthrows Base64Exception {
        try {
            ostream.write(new String(encodeChunk(idol)).getBytes());
        } catch (IOException e) {
            throw new Base64Exception(new Message("BASE64_ENCODE_IOEXCEPTION"), e);
        }
    }
    // Outputs base64 representation of the specified byte 
    // array to a character stream.
    //
    public static void encode(byte[] id,
                              int o,
                              int l,
                              Writer writerthrows Base64Exception {
        try {
            writer.write(encodeChunk(idol));
        } catch (IOException e) {
            throw new Base64Exception(new Message("BASE64_ENCODE_WRITER_IOEXCEPTION"), e);
        }
    }
    //---- Private static methods --------------------------------------

    
The process routine processes an atomic base64 unit of encoding (encodeme) into its native encoding. This class is used by decode routines to do the grunt work of decoding base64 encoded information

Parameters:
ib Input character buffer of encoded bytes
ob Output byte buffer of decoded bytes
p Pointer to the encodeme of interest
Returns:
The decoded encodeme
Throws:
Base64Exception Thrown is processing fails due to formatting exceptions in the encoded data
 
    private static int processEncodeme(char[] ib,
                                       byte[] ob,
                                       int p
        throws Base64Exception {
        
        int spad = ;        
        if (ib[3] == ) {
            spad = ;
        }
        if (ib[2] == ) {
            spad = ;
        }
        int b0 = [ib[0]];
        int b1 = [ib[1]];
        int b2 = [ib[2]];
        int b3 = [ib[3]];
        switch (spad) {
        case :
            ob[p] = (byte)(b0 << 2 & 0xfc | b1 >> 4 & 0x3);
            return ;
        case :
            ob[p++] = (byte)(b0 << 2 & 0xfc | b1 >> 4 & 0x3);
            ob[p] = (byte)(b1 << 4 & 0xf0 | b2 >> 2 & 0xf);
            return ;
        case :
            ob[p++] = (byte)(b0 << 2 & 0xfc | b1 >> 4 & 0x3);
            ob[p++] = (byte)(b1 << 4 & 0xf0 | b2 >> 2 & 0xf);
            ob[p] = (byte)(b2 << 6 & 0xc0 | b3 & 0x3f);
            return ;
        default:
            // We should never get here
            throw new IllegalStateException();
        } 
    } 
New to GrepCode? Check out our FAQ X