public int decode()

in geronimo-mail_2.1_spec/src/main/java/org/apache/geronimo/mail/util/Base64Encoder.java [348:432]


    public int decode(final byte[] data, final int off, final int length, final byte[] out) throws IOException
    {
        byte    b1, b2, b3, b4;
        int        outLen = 0;

        int        end = off + length;

        while (end > 0)
        {
            if (!ignore((char)data[end - 1]))
            {
                break;
            }

            end--;
        }

        int  i = off;
        final int  finish = end - 4;

        while (i < finish)
        {
            while ((i < finish) && ignore((char)data[i]))
            {
                i++;
            }

            b1 = decodingTable[data[i++]];

            while ((i < finish) && ignore((char)data[i]))
            {
                i++;
            }

            b2 = decodingTable[data[i++]];

            while ((i < finish) && ignore((char)data[i]))
            {
                i++;
            }

            b3 = decodingTable[data[i++]];

            while ((i < finish) && ignore((char)data[i]))
            {
                i++;
            }

            b4 = decodingTable[data[i++]];

            out[outLen++] = (byte)((b1 << 2) | (b2 >> 4));
            out[outLen++] = (byte)((b2 << 4) | (b3 >> 2));
            out[outLen++] = (byte)((b3 << 6) | b4);
        }

        if (data[end - 2] == padding)
        {
            b1 = decodingTable[data[end - 4]];
            b2 = decodingTable[data[end - 3]];

            out[outLen++] = (byte)((b1 << 2) | (b2 >> 4));
        }
        else if (data[end - 1] == padding)
        {
            b1 = decodingTable[data[end - 4]];
            b2 = decodingTable[data[end - 3]];
            b3 = decodingTable[data[end - 2]];

            out[outLen++] = (byte)((b1 << 2) | (b2 >> 4));
            out[outLen++] = (byte)((b2 << 4) | (b3 >> 2));
        }
        else
        {
            b1 = decodingTable[data[end - 4]];
            b2 = decodingTable[data[end - 3]];
            b3 = decodingTable[data[end - 2]];
            b4 = decodingTable[data[end - 1]];

            out[outLen++] = (byte)((b1 << 2) | (b2 >> 4));
            out[outLen++] = (byte)((b2 << 4) | (b3 >> 2));
            out[outLen++] = (byte)((b3 << 6) | b4);
        }

        return outLen;
    }