/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.codec; import java.util.Arrays; /** * Stateful base 64 decoder with support for line breaks. * * @author Middleware Services */ public class Base64Decoder extends AbstractBaseNDecoder { /** Default base-64 character decoding table. */ private static final byte[] DEFAULT_DECODING_TABLE = new byte[128]; /** URL and filesystem-safe base-64 character decoding table. */ private static final byte[] URLSAFE_DECODING_TABLE = new byte[128]; /** * Initializes the character decoding table. */ static { Arrays.fill(DEFAULT_DECODING_TABLE, (byte) -1); for (int i = 0; i < 26; i++) { DEFAULT_DECODING_TABLE[i + 65] = (byte) i; } for (int i = 0; i < 26; i++) { DEFAULT_DECODING_TABLE[i + 97] = (byte) (i + 26); } for (int i = 0; i < 10; i++) { DEFAULT_DECODING_TABLE[i + 48] = (byte) (i + 52); } System.arraycopy(DEFAULT_DECODING_TABLE, 0, URLSAFE_DECODING_TABLE, 0, 128); DEFAULT_DECODING_TABLE[43] = (byte) 62; DEFAULT_DECODING_TABLE[47] = (byte) 63; URLSAFE_DECODING_TABLE[45] = (byte) 62; URLSAFE_DECODING_TABLE[95] = (byte) 63; } /** Creates a new instance that decodes base 64-encoded input in the default character set. */ public Base64Decoder() { this(false); } /** * Creates a new instance that decodes base 64-encoded input in the optional URL-safe character set. * * @param urlSafe True to use URL and filesystem-safe character set, false otherwise. */ public Base64Decoder(final boolean urlSafe) { super(urlSafe ? URLSAFE_DECODING_TABLE : DEFAULT_DECODING_TABLE); } @Override protected int getBlockLength() { return 24; } @Override protected int getBitsPerChar() { return 6; } }