/* See LICENSE for licensing and NOTICE for copyright. */
package org.cryptacular.codec;
/**
* Stateful base 64 encoder with support for configurable line breaks.
*
* @author Middleware Services
*/
public class Base64Encoder extends AbstractBaseNEncoder
{
/** Default base 64 character encoding table. */
private static final char[] DEFAULT_ENCODING_TABLE = new char[64];
/** Filesystem and URL-safe base 64 character encoding table. */
private static final char[] URLSAFE_ENCODING_TABLE = new char[64];
/**
* Initializes the encoding character table.
*/
static {
final String defaultCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for (int i = 0; i < defaultCharset.length(); i++) {
DEFAULT_ENCODING_TABLE[i] = defaultCharset.charAt(i);
URLSAFE_ENCODING_TABLE[i] = defaultCharset.charAt(i);
}
URLSAFE_ENCODING_TABLE[62] = '-';
URLSAFE_ENCODING_TABLE[63] = '_';
}
/** Creates a new instance that produces base 64-encoded output with no line breaks in the default character set. */
public Base64Encoder()
{
// Default to no line breaks.
this(-1);
}
/**
* Creates a new instance that produces base 64-encoded output with no line breaks and optional URL-safe character
* set.
*
* @param urlSafe True to use URL and filesystem-safe character set, false otherwise.
*/
public Base64Encoder(final boolean urlSafe)
{
this(urlSafe, -1);
}
/**
* Creates a new instance that produces base 64-encoded output with the given number of characters per line in the
* default character set.
*
* @param charactersPerLine Number of characters per line. A zero or negative value disables line breaks.
*/
public Base64Encoder(final int charactersPerLine)
{
this(false, charactersPerLine);
}
/**
* Creates a new instance that produces base 64-encoded output with the given number of characters per line with the
* option of URL-safe character set.
*
* @param urlSafe True to use URL and filesystem-safe character set, false otherwise.
* @param charactersPerLine Number of characters per line. A zero or negative value disables line breaks.
*/
public Base64Encoder(final boolean urlSafe, final int charactersPerLine)
{
super(urlSafe ? URLSAFE_ENCODING_TABLE : DEFAULT_ENCODING_TABLE, charactersPerLine);
}
@Override
protected int getBlockLength()
{
return 24;
}
@Override
protected int getBitsPerChar()
{
return 6;
}
}