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;
}