Java Base64 Decode base64Decode(char[] a_data)

Here you can find the source of base64Decode(char[] a_data)

Description

Decodes a BASE-64 encoded stream to recover the original data.

License

Apache License

Parameter

Parameter Description
a_data data to decode.

Return

the decoded binary data.

Declaration

public static byte[] base64Decode(char[] a_data) 

Method Source Code

//package com.java2s;
/*/*  w  ww . ja  va2s .co m*/
 * Copyright 2006-2012 The Scriptella Project Team.
 *
 * Licensed 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.
 */

public class Main {
    /** lookup table for converting base64 characters to value in range 0..63 */
    private static byte[] s_codes = new byte[256];

    /**
     * Decodes a BASE-64 encoded stream to recover the original data. White
     * space before and after will be trimmed away, but no other manipulation of
     * the input will be performed. As of version 1.2 this method will properly
     * handle input containing junk characters (newlines and the like) rather
     * than throwing an error. It does this by pre-parsing the input and
     * generating from that a count of VALID input characters.
     *
     * @param a_data
     *            data to decode.
     * @return the decoded binary data.
     */
    public static byte[] base64Decode(char[] a_data) {
        // as our input could contain non-BASE64 data (newlines,
        // whitespace of any sort, whatever) we must first adjust
        // our count of USABLE data so that...
        // (a) we don't misallocate the output array, and
        // (b) think that we miscalculated our data length
        // just because of extraneous throw-away junk

        int l_tempLen = a_data.length;
        for (char anA_data1 : a_data) {
            if ((anA_data1 > 255) || s_codes[anA_data1] < 0) {
                --l_tempLen; // ignore non-valid chars and padding
            }
        }
        // calculate required length:
        // -- 3 bytes for every 4 valid base64 chars
        // -- plus 2 bytes if there are 3 extra base64 chars,
        // or plus 1 byte if there are 2 extra.

        int l_len = (l_tempLen / 4) * 3;

        if ((l_tempLen % 4) == 3) {
            l_len += 2;
        }

        if ((l_tempLen % 4) == 2) {
            l_len += 1;
        }

        byte[] l_out = new byte[l_len];

        int l_shift = 0; // # of excess bits stored in accum
        int l_accum = 0; // excess bits
        int l_index = 0;

        // we now go through the entire array (NOT using the 'tempLen' value)
        for (char anA_data : a_data) {
            int l_value = (anA_data > 255) ? -1 : s_codes[anA_data];

            if (l_value >= 0) // skip over non-code
            {
                l_accum <<= 6; // bits shift up by 6 each time thru
                l_shift += 6; // loop, with new bits being put in
                l_accum |= l_value; // at the bottom. whenever there
                if (l_shift >= 8) // are 8 or more shifted in, write them
                {
                    l_shift -= 8; // out (from the top, leaving any excess
                    l_out[l_index++] = // at the bottom for next iteration.
                            (byte) ((l_accum >> l_shift) & 0xff);
                }
            }
            // we will also have skipped processing a padding null byte ('=')
            // here;
            // these are used ONLY for padding to an even length and do not
            // legally
            // occur as encoded data. for this reason we can ignore the fact
            // that
            // no index++ operation occurs in that special case: the out[] array
            // is
            // initialized to all-zero bytes to start with and that works to our
            // advantage in this combination.
        }

        // if there is STILL something wrong we just have to throw up now!
        if (l_index != l_out.length) {
            throw new Error("Miscalculated data length (wrote " + l_index + " instead of " + l_out.length + ")");
        }

        return l_out;
    }
}

Related

  1. base64CodeDecode(String fileData)
  2. Base64Decode(byte[] base64Data)
  3. base64Decode(byte[] data)
  4. base64Decode(byte[] textBytes)
  5. base64Decode(final String data)
  6. base64Decode(final String s)
  7. base64Decode(String _s, String _enc)
  8. base64Decode(String b64)