wttools.utils
Class Base64

java.lang.Object
  |
  +--wttools.utils.Base64

public class Base64
extends java.lang.Object

Implements Base64 encoding and decoding as defined by RFC 2045: "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies" page 23. More information about this class is available from ostermiller.org.

The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable. The encoding and decoding algorithms are simple, but the encoded data are consistently only about 33 percent larger than the unencoded data. This encoding is virtually identical to the one used in Privacy Enhanced Mail (PEM) applications, as defined in RFC 1421.

A 65-character subset of US-ASCII is used, enabling 6 bits to be represented per printable character. (The extra 65th character, "=", is used to signify a special processing function.)

NOTE: This subset has the important property that it is represented identically in all versions of ISO 646, including US-ASCII, and all characters in the subset are also represented identically in all versions of EBCDIC. Other popular encodings, such as the encoding used by the uuencode utility, Macintosh binhex 4.0 [RFC-1741], and the base85 encoding specified as part of Level 2 PostScript, do not share these properties, and thus do not fulfill the portability requirements a binary transport encoding for mail must meet.

The encoding process represents 24-bit groups of input bits as output strings of 4 encoded characters. Proceeding from left to right, a 24-bit input group is formed by concatenating 3 8bit input groups. These 24 bits are then treated as 4 concatenated 6-bit groups, each of which is translated into a single digit in the base64 alphabet. When encoding a bit stream via the base64 encoding, the bit stream must be presumed to be ordered with the most-significant-bit first. That is, the first bit in the stream will be the high-order bit in the first 8bit byte, and the eighth bit will be the low-order bit in the first 8bit byte, and so on.

Each 6-bit group is used as an index into an array of 64 printable characters. The character referenced by the index is placed in the output string. These characters, identified in Table 1, below, are selected so as to be universally representable, and the set excludes characters with particular significance to SMTP (e.g., ".", CR, LF) and to the multipart boundary delimiters defined in RFC 2046 (e.g., "-").

                  Table 1: The Base64 Alphabet

   Value Encoding  Value Encoding  Value Encoding  Value Encoding
       0 A            17 R            34 i            51 z
       1 B            18 S            35 j            52 0
       2 C            19 T            36 k            53 1
       3 D            20 U            37 l            54 2
       4 E            21 V            38 m            55 3
       5 F            22 W            39 n            56 4
       6 G            23 X            40 o            57 5
       7 H            24 Y            41 p            58 6
       8 I            25 Z            42 q            59 7
       9 J            26 a            43 r            60 8
      10 K            27 b            44 s            61 9
      11 L            28 c            45 t            62 +
      12 M            29 d            46 u            63 /
      13 N            30 e            47 v
      14 O            31 f            48 w         (pad) =
      15 P            32 g            49 x
      16 Q            33 h            50 y
 

The encoded output stream must be represented in lines of no more than 76 characters each. All line breaks or other characters not found in Table 1 must be ignored by decoding software. In base64 data, characters other than those in Table 1, line breaks, and other white space probably indicate a transmission error, about which a warning message or even a message rejection might be appropriate under some circumstances.

Special processing is performed if fewer than 24 bits are available at the end of the data being encoded. A full encoding quantum is always completed at the end of a body. When fewer than 24 input bits are available in an input group, zero bits are added (on the right) to form an integral number of 6-bit groups. Padding at the end of the data is performed using the "=" character. Since all base64 input is an integral number of octets, only the following cases can arise: (1) the final quantum of encoding input is an integral multiple of 24 bits; here, the final unit of encoded output will be an integral multiple of 4 characters with no "=" padding, (2) the final quantum of encoding input is exactly 8 bits; here, the final unit of encoded output will be two characters followed by two "=" padding characters, or (3) the final quantum of encoding input is exactly 16 bits; here, the final unit of encoded output will be three characters followed by one "=" padding character.

Because it is used only for padding at the end of the data, the occurrence of any "=" characters may be taken as evidence that the end of the data has been reached (without truncation in transit). No such assurance is possible, however, when the number of octets transmitted was a multiple of three and no "=" characters are present.

Any characters outside of the base64 alphabet are to be ignored in base64-encoded data.

Care must be taken to use the proper octets for line breaks if base64 encoding is applied directly to text material that has not been converted to canonical form. In particular, text line breaks must be converted into CRLF sequences prior to base64 encoding. The important thing to note is that this may be done directly by the encoder rather than in a prior canonicalization step in some implementations.

NOTE: There is no need to worry about quoting potential boundary delimiters within base64-encoded bodies within multipart entities because no hyphen characters are used in the base64 encoding.

Version:
$Revision: 1.1 $
Author:
Stephen Ostermiller

Field Summary
protected static byte[] base64Chars
          Table of the sixty-four characters that are used as the Base64 alphabet: [A-Za-z0-9+/]
protected static byte[] reverseBase64Chars
          Reverse lookup table for the Base64 alphabet.
 
Method Summary
static byte[] decode(byte[] bytes)
          Decode Base64 encoded bytes.
static void decode(java.io.InputStream in, java.io.OutputStream out, boolean throwExceptions)
          Decode Base64 encoded data from the InputStream to the OutputStream.
static java.lang.String decode(java.lang.String string)
          Decode a Base64 encoded String.
static java.lang.String decode(java.lang.String string, java.lang.String enc)
          Decode a Base64 encoded String.
static byte[] encode(byte[] bytes)
          Encode bytes in Base64.
static void encode(java.io.InputStream in, java.io.OutputStream out, boolean lineBreaks)
          Encode data from the InputStream to the OutputStream in Base64.
static java.lang.String encode(java.lang.String string)
          Encode a String in Base64.
static java.lang.String encode(java.lang.String string, java.lang.String enc)
          Encode a String in Base64.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

base64Chars

protected static final byte[] base64Chars
Table of the sixty-four characters that are used as the Base64 alphabet: [A-Za-z0-9+/]

reverseBase64Chars

protected static final byte[] reverseBase64Chars
Reverse lookup table for the Base64 alphabet. reversebase64Chars[byte] gives n for the nth Base64 character or -1 if a character is not a Base64 character.
Method Detail

encode

public static java.lang.String encode(java.lang.String string)
Encode a String in Base64. The String is converted to and from bytes according to the platform's default character encoding. No line breaks or other white space are inserted into the encoded data.
Parameters:
string - The data to encode.
Returns:
An encoded String.

encode

public static java.lang.String encode(java.lang.String string,
                                      java.lang.String enc)
                               throws java.io.UnsupportedEncodingException
Encode a String in Base64. No line breaks or other white space are inserted into the encoded data.
Parameters:
string - The data to encode.
enc - Character encoding to use when converting to and from bytes.
Returns:
An encoded String.
Throws:
java.io.UnsupportedEncodingException - if the character encoding specified is not supported.

encode

public static byte[] encode(byte[] bytes)
Encode bytes in Base64. No line breaks or other white space are inserted into the encoded data.
Parameters:
bytes - The data to encode.
Returns:
Encoded bytes.

encode

public static void encode(java.io.InputStream in,
                          java.io.OutputStream out,
                          boolean lineBreaks)
                   throws java.io.IOException
Encode data from the InputStream to the OutputStream in Base64.
Parameters:
in - Stream from which to read data that needs to be encoded.
out - Stream to which to write encoded data.
lineBreaks - Whether to insert line breaks every 76 characters in the output.
Throws:
java.io.IOException - if there is a problem reading or writing.

decode

public static java.lang.String decode(java.lang.String string)
Decode a Base64 encoded String. Characters that are not part of the Base64 alphabet are ignored in the input. The String is converted to and from bytes according to the platform's default character encoding.
Parameters:
string - The data to decode.
Returns:
A decoded String.

decode

public static java.lang.String decode(java.lang.String string,
                                      java.lang.String enc)
                               throws java.io.UnsupportedEncodingException
Decode a Base64 encoded String. Characters that are not part of the Base64 alphabet are ignored in the input.
Parameters:
string - The data to decode.
enc - Character encoding to use when converting to and from bytes.
Returns:
A decoded String.
Throws:
java.io.UnsupportedEncodingException - if the character encoding specified is not supported.

decode

public static byte[] decode(byte[] bytes)
Decode Base64 encoded bytes. Characters that are not part of the Base64 alphabet are ignored in the input.
Parameters:
bytes - The data to decode.
Returns:
Decoded bytes.

decode

public static void decode(java.io.InputStream in,
                          java.io.OutputStream out,
                          boolean throwExceptions)
                   throws java.io.IOException
Decode Base64 encoded data from the InputStream to the OutputStream. Characters in the Base64 alphabet, white space and equals sign are expected to be in urlencoded data. The presence of other characters could be a sign that the data is corrupted.
Parameters:
in - Stream from which to read data that needs to be decoded.
out - Stream to which to write decoded data.
throwExceptions - Whether to throw exceptions when unexpected data is encountered.
Throws:
java.io.IOException - if an IO occurs or unexpected data is encountered.


Copyright GNU, wttools developers Team.