in geronimo-mail_2.1_spec/src/main/java/org/apache/geronimo/mail/util/Base64Encoder.java [533:585]
public void encodeWordData(final byte[] data, final StringBuffer out)
{
final int modulus = data.length % 3;
final int dataLength = (data.length - modulus);
int a1, a2, a3;
for (int i = 0; i < dataLength; i += 3)
{
a1 = data[i] & 0xff;
a2 = data[i + 1] & 0xff;
a3 = data[i + 2] & 0xff;
out.append((char)encodingTable[(a1 >>> 2) & 0x3f]);
out.append((char)encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f]);
out.append((char)encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f]);
out.append((char)encodingTable[a3 & 0x3f]);
}
/*
* process the tail end.
*/
int b1, b2, b3;
int d1, d2;
switch (modulus)
{
case 0: /* nothing left to do */
break;
case 1:
d1 = data[dataLength] & 0xff;
b1 = (d1 >>> 2) & 0x3f;
b2 = (d1 << 4) & 0x3f;
out.append((char)encodingTable[b1]);
out.append((char)encodingTable[b2]);
out.append((char)padding);
out.append((char)padding);
break;
case 2:
d1 = data[dataLength] & 0xff;
d2 = data[dataLength + 1] & 0xff;
b1 = (d1 >>> 2) & 0x3f;
b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f;
b3 = (d2 << 2) & 0x3f;
out.append((char)encodingTable[b1]);
out.append((char)encodingTable[b2]);
out.append((char)encodingTable[b3]);
out.append((char)padding);
break;
}
}