/*
*
*
* Copyright 2005 Vincent Massol.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
*/
import java.io.ByteArrayOutputStream;
/**
* Provides utility methods to Base64 encode data. This class uses the Base64 encoding as specified
* in RFC 2045, 6.8. Base64 Content-Transfer-Encoding.
*
* @version $Id: Base64.java 1705 2008-09-02 13:14:55Z adriana $
*/
public final class Base64
{
// constants --------------------------------------------------------------
/**
* The Base64 character set look-up table. This consists of the following ordered alphanumerics:
* A-Z, a-z, 0-9, + and /.
*/
private static final char[] ENCODE = new char[64];
/**
* The character to pad the output with if not a multiple of 24-bits.
*/
private static final char PAD_CHAR = '=';
// static -----------------------------------------------------------------
static
{
// create Base64 character look-up table
for (int i = 0; i < 26; i++)
{
ENCODE[i] = (char) ('A' + i);
ENCODE[i + 26] = (char) ('a' + i);
}
for (int i = 0; i < 10; i++)
{
ENCODE[i + 52] = (char) ('0' + i);
}
ENCODE[62] = '+';
ENCODE[63] = '/';
}
// constructors -----------------------------------------------------------
/**
* Private to prevent unnecessary instantation.
*/
private Base64()
{
// Private to prevent unnecessary instantation
}
// public methods ---------------------------------------------------------
/**
* Base64 encodes the specified bytes. This method is provided for signature compatibility with
* commons-codec.
*
* @param bytes the bytes to encode
* @return the encoded bytes
*/
public static byte[] encodeBase64(byte[] bytes)
{
return encode(bytes);
}
/**
* Base64 encodes the specified string using the platform's default encoding.
*
* @param string the string to encode
* @return the encoded string
*/
public static String encode(String string)
{
return new String(encode(string.getBytes()));
}
/**
* Base64 encodes the specified bytes.
*
* @param bytes the bytes to encode
* @return the encoded bytes
*/
public static byte[] encode(byte[] bytes)
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
int count = 0;
int carry = 0;
for (int i = 0; i < bytes.length; i++)
{
byte b = bytes[i];
switch (count++ % 3)
{
// first byte of 24-bits: write 6-bits and carry 2-bits
case 0:
out.write(ENCODE[b >> 2]);
carry = b & 0x03;
break;
// second byte of 24-bits: write carry + 4-bits, carry 4-bits
case 1:
out.write(ENCODE[(carry << 4) + (b >> 4)]);
carry = b & 0x0F;
break;
// third byte of 24-bits: write carry + 2-bits, write 6-bits
case 2:
out.write(ENCODE[(carry << 2) + (b >> 6)]);
out.write(ENCODE[b & 0x3F]);
break;
default:
throw new InternalError();
}
}
switch (count % 3)
{
// third byte of 24-bits: 24-bit aligned
case 0:
break;
// first byte of 24-bits: write 4-bit carry and pad 16-bits
case 1:
out.write(ENCODE[carry << 4]);
out.write(PAD_CHAR);
out.write(PAD_CHAR);
break;
// second byte of 24-bits: write 2-bit carry and pad 8-bits
case 2:
out.write(ENCODE[carry << 2]);
out.write(PAD_CHAR);
break;
default:
throw new InternalError();
}
return out.toByteArray();
}
}
|