base64Data = discardWhitespace(base64Data);
base64Data = discardNonBase64(base64Data);
    public static byte[] decodeBase64(byte[] base64Data) {        // RFC 2045 suggests line wrapping at (no more than) 76        // characters -- we may have embedded whitespace.        base64Data = discardWhitespace(base64Data);        // handle the edge case, so we don't have to worry about it later        if (base64Data.length == 0) {            return new byte[0];        }        int numberQuadruple = base64Data.length / FOURBYTE;        byte decodedData[] = null;        byte b1 = 0, b2 = 0, b3 = 0, b4 = 0, marker0 = 0, marker1 = 0;        // Throw away anything not in base64Data        int encodedIndex = 0;        int dataIndex = 0;        {            // this sizes the output array properly - rlw            int lastData = base64Data.length;            // ignore the '=' padding            while (base64Data[lastData - 1] == PAD) {                if (--lastData == 0) {                    return new byte[0];                }            }            decodedData = new byte[lastData - numberQuadruple];        }        for (int i = 0; i < numberQuadruple; i++) {            dataIndex = i * 4;            marker0 = base64Data[dataIndex + 2];            marker1 = base64Data[dataIndex + 3];            b1 = base64Alphabet[base64Data[dataIndex]];            b2 = base64Alphabet[base64Data[dataIndex + 1]];            if (marker0 != PAD && marker1 != PAD) {                //No PAD e.g 3cQl                b3 = base64Alphabet[marker0];                b4 = base64Alphabet[marker1];                decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);                decodedData[encodedIndex + 1] =                    (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));                decodedData[encodedIndex + 2] = (byte) (b3 << 6 | b4);            }             else if (marker0 == PAD) {                //Two PAD e.g. 3c[Pad][Pad]                decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);            }             else if (marker1 == PAD) {                //One PAD e.g. 3cQ[Pad]                b3 = base64Alphabet[marker0];                decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);                decodedData[encodedIndex + 1] =                    (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));            }            encodedIndex += 3;        }        return decodedData;    }