BASE64MailboxDecoderpublic class BASE64MailboxDecoder extends Object See the BASE64MailboxEncoder for a description of the RFC2060 and how
mailbox names should be encoded. This class will do the correct decoding
for mailbox names. |
Fields Summary |
---|
static final char[] | pem_arrayThis character array provides the character to value map
based on RFC1521, but with the modification from RFC2060
which changes the '/' to a ','. | private static final byte[] | pem_convert_array |
Methods Summary |
---|
protected static int | base64decode(char[] buffer, int offset, java.text.CharacterIterator iter)
boolean firsttime = true;
int leftover = -1;
while(true) {
// get the first byte
byte orig_0 = (byte) iter.next();
if (orig_0 == -1) break; // no more chars
if (orig_0 == '-") {
if (firsttime) {
// means we got the string "&-" which is turned into a "&"
buffer[offset++] = '&";
}
// we are done now
break;
}
firsttime = false;
// next byte
byte orig_1 = (byte) iter.next();
if (orig_1 == -1 || orig_1 == '-")
break; // no more chars, invalid base64
byte a, b, current;
a = pem_convert_array[orig_0 & 0xff];
b = pem_convert_array[orig_1 & 0xff];
// The first decoded byte
current = (byte)(((a << 2) & 0xfc) | ((b >>> 4) & 3));
// use the leftover to create a Unicode Character (2 bytes)
if (leftover != -1) {
buffer[offset++] = (char)(leftover << 8 | (current & 0xff));
leftover = -1;
} else {
leftover = current & 0xff;
}
byte orig_2 = (byte) iter.next();
if (orig_2 == '=") { // End of this BASE64 encoding
continue;
} else if (orig_2 == -1 || orig_2 == '-") {
break; // no more chars
}
// second decoded byte
a = b;
b = pem_convert_array[orig_2 & 0xff];
current = (byte)(((a << 4) & 0xf0) | ((b >>> 2) & 0xf));
// use the leftover to create a Unicode Character (2 bytes)
if (leftover != -1) {
buffer[offset++] = (char)(leftover << 8 | (current & 0xff));
leftover = -1;
} else {
leftover = current & 0xff;
}
byte orig_3 = (byte) iter.next();
if (orig_3 == '=") { // End of this BASE64 encoding
continue;
} else if (orig_3 == -1 || orig_3 == '-") {
break; // no more chars
}
// The third decoded byte
a = b;
b = pem_convert_array[orig_3 & 0xff];
current = (byte)(((a << 6) & 0xc0) | (b & 0x3f));
// use the leftover to create a Unicode Character (2 bytes)
if (leftover != -1) {
buffer[offset++] = (char)(leftover << 8 | (current & 0xff));
leftover = -1;
} else {
leftover = current & 0xff;
}
}
return offset;
| public static java.lang.String | decode(java.lang.String original)
if (original == null || original.length() == 0)
return original;
boolean changedString = false;
int copyTo = 0;
// it will always be less than the original
char[] chars = new char[original.length()];
StringCharacterIterator iter = new StringCharacterIterator(original);
for(char c = iter.first(); c != CharacterIterator.DONE;
c = iter.next()) {
if (c == '&") {
changedString = true;
copyTo = base64decode(chars, copyTo, iter);
} else {
chars[copyTo++] = c;
}
}
// now create our string from the char array
if (changedString) {
return new String(chars, 0, copyTo);
} else {
return original;
}
|
|