`
guoweimail
  • 浏览: 205928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Base64Decoder源码

    博客分类:
  • Java
 
阅读更多

import java.io.*;

/*******************************************************************************
 * A class to decode Base64 streams and strings. See RFC 1521 section 5.2 for
 * details of the Base64 algorithm.
 * <p>
 * This class can be used for decoding strings: <blockquote>
 * 
 * <pre>
 * String encoded = &quot;d2VibWFzdGVyOnRyeTJndWVTUw&quot;;
 * String decoded = Base64Decoder.decode(encoded);
 * </pre>
 * 
 * </blockquote> or for decoding streams: <blockquote>
 * 
 * <pre>
 * InputStream in = new Base64Decoder(System.in);
 * </pre>
 * 
 * </blockquote>
 * 
 * @author <b>Jason Hunter</b>, Copyright &#169; 2000
 * @version 1.1, 2002/11/01, added decodeToBytes() to better handle binary data
 *          (thanks to Sean Graham)
 * @version 1.0, 2000/06/11
 */
public class Base64Decoder extends FilterInputStream {

	private static final char[] chars = { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
			'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
			'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
			'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
			'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6',
			'7', '8', '9', '+', '/' };

	// A mapping between char values and six-bit integers
	private static final int[] ints = new int[128];
	static {
		for (int i = 0; i < 64; i++) {
			ints[chars[i]] = i;
		}
	}

	private int charCount;
	private int carryOver;

	/***************************************************************************
	 * Constructs a new Base64 decoder that reads input from the given
	 * InputStream.
	 * 
	 * @param in
	 *            the input stream
	 */
	public Base64Decoder(InputStream in) {
		super(in);
	}

	/***************************************************************************
	 * Returns the next decoded character from the stream, or -1 if end of
	 * stream was reached.
	 * 
	 * @return the decoded character, or -1 if the end of the input stream is
	 *         reached
	 * @exception IOException
	 *                if an I/O error occurs
	 */
	public int read() throws IOException {
		// Read the next non-whitespace character
		int x;
		do {
			x = in.read();
			if (x == -1) {
				return -1;
			}
		} while (Character.isWhitespace((char) x));
		charCount++;

		// The '=' sign is just padding
		if (x == '=') {
			return -1; // effective end of stream
		}

		// Convert from raw form to 6-bit form
		x = ints[x];

		// Calculate which character we're decoding now
		int mode = (charCount - 1) % 4;

		// First char save all six bits, go for another
		if (mode == 0) {
			carryOver = x & 63;
			return read();
		}
		// Second char use previous six bits and first two new bits,
		// save last four bits
		else if (mode == 1) {
			int decoded = ((carryOver << 2) + (x >> 4)) & 255;
			carryOver = x & 15;
			return decoded;
		}
		// Third char use previous four bits and first four new bits,
		// save last two bits
		else if (mode == 2) {
			int decoded = ((carryOver << 4) + (x >> 2)) & 255;
			carryOver = x & 3;
			return decoded;
		}
		// Fourth char use previous two bits and all six new bits
		else if (mode == 3) {
			int decoded = ((carryOver << 6) + x) & 255;
			return decoded;
		}
		return -1; // can't actually reach this line
	}

	/***************************************************************************
	 * Reads decoded data into an array of bytes and returns the actual number
	 * of bytes read, or -1 if end of stream was reached.
	 * 
	 * @param buf
	 *            the buffer into which the data is read
	 * @param off
	 *            the start offset of the data
	 * @param len
	 *            the maximum number of bytes to read
	 * @return the actual number of bytes read, or -1 if the end of the input
	 *         stream is reached
	 * @exception IOException
	 *                if an I/O error occurs
	 */
	public int read(byte[] buf, int off, int len) throws IOException {
		if (buf.length < (len + off - 1)) {
			throw new IOException("The input buffer is too small: " + len
					+ " bytes requested starting at offset " + off
					+ " while the buffer " + " is only " + buf.length
					+ " bytes long.");
		}

		// This could of course be optimized
		int i;
		for (i = 0; i < len; i++) {
			int x = read();
			if (x == -1 && i == 0) { // an immediate -1 returns -1
				return -1;
			} else if (x == -1) { // a later -1 returns the chars read so far
				break;
			}
			buf[off + i] = (byte) x;
		}
		return i;
	}

	/***************************************************************************
	 * Returns the decoded form of the given encoded string, as a String. Note
	 * that not all binary data can be represented as a String, so this method
	 * should only be used for encoded String data. Use decodeToBytes()
	 * otherwise.
	 * 
	 * @param encoded
	 *            the string to decode
	 * @return the decoded form of the encoded string
	 */
	public static String decode(String encoded) {
		return new String(decodeToBytes(encoded));
	}
	
	public static byte[] decodeReturnByte(String encodedStr) {
		return decodeToBytes(encodedStr);
	}

	/***************************************************************************
	 * Returns the decoded form of the given encoded string, as bytes.
	 * 
	 * @param encoded
	 *            the string to decode
	 * @return the decoded form of the encoded string
	 */
	public static byte[] decodeToBytes(String encoded) {
		byte[] bytes = null;
		try {
			bytes = encoded.getBytes("8859_1");
		} catch (UnsupportedEncodingException ignored) {
		}

		Base64Decoder in = new Base64Decoder(new ByteArrayInputStream(bytes));

		ByteArrayOutputStream out = new ByteArrayOutputStream(
				(int) (bytes.length * 0.67));

		try {
			byte[] buf = new byte[4 * 1024]; // 4K buffer
			int bytesRead;
			while ((bytesRead = in.read(buf)) != -1) {
				out.write(buf, 0, bytesRead);
			}
			out.close();

			return out.toByteArray();
		} catch (IOException ignored) {
			return null;
		}
	}

	public static void main(String[] args) throws Exception {
		if (args.length != 1) {
			System.err.println("Usage: java Base64Decoder fileToDecode");
			return;
		}

		Base64Decoder decoder = null;
		try {
			decoder = new Base64Decoder(new BufferedInputStream(new FileInputStream(args[0])));
			byte[] buf = new byte[4 * 1024]; // 4K buffer
			int bytesRead;
			while ((bytesRead = decoder.read(buf)) != -1) {
				System.out.write(buf, 0, bytesRead);
			}
		} finally {
			if (decoder != null)
				decoder.close();
		}
	}
	
}
 
分享到:
评论

相关推荐

    BASE64Encoder及BASE64Decoder的源码

    `Base64.Encoder`接口代表Base64编码器,而`Base64.Decoder`接口代表Base64解码器。你可以通过`Base64.getEncoder()`和`Base64.getDecoder()`获取默认的编码器和解码器实例。例如: ```java import java.util.Base...

    sun.misc.BASE64Decoder(Android Base64Jar包以及Java源代码)

    sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...

    BASE64Encoder 与 BASE64Decoder 源代码

    在Java中,`BASE64Encoder`和`BASE64Decoder`是两个核心类,分别用于对数据进行BASE64编码和解码。 `BASE64Encoder`类: 这个类在Java SDK中位于`javax.crypto`包下,主要负责将字节序列(byte array)转换为BASE...

    sun.misc.BASE64Encoder源码及jar包

    在Java编程语言中,`sun.misc.BASE64Encoder`和`BASE64Decoder`是用于进行Base64编码和解码的内部类,它们属于`sun.misc`包,这是一个非公开(非标准)的Java库。`sun.misc`包中的类主要用于JVM内部使用,因此在官方...

    sun.misc.BASE64Decoder

    解决android无法使用sun.misc.CharacterDecoder,添加了rt.jar也不行。...BASE64Decoder.java BASE64Encoder.java CEFormatException.java CEStreamExhausted.java CharacterDecoder.java CharacterEncoder.java

    eclipse中解除jdk的访问限制(以BASE64Encoder/BASE64Decoder为例)

    然而,有时我们可能会遇到访问特定类或库的限制,比如标题中提到的`BASE64Encoder`和`BASE64Decoder`。这两个类是Java的标准库中的工具类,用于进行Base64编码和解码。但在某些情况下,Eclipse可能无法直接使用这些...

    sun.misc.BASE64Encoder 加密源码+完整包.rar

    在Java编程语言中,`sun.misc.BASE64Encoder` 和 `sun.misc.BASE64Decoder` 是两个用于Base64编码和解码的内部类,它们位于`sun.misc`包下。Base64是一种用于在网络上传输二进制数据的文本编码方式,它将任意的字节...

    java base64源码+jar包

    然而,描述中提到的是一个名为`BASE64Encoder.jar`的文件,这可能是一个早期的Java库,用于处理Base64编码和解码,可能在Java 8之前使用,因为它包含了`BASE64Encoder`和`BASE64Decoder`这两个类。 `BASE64Encoder`...

    BASE64加密源码完整JAR包

    这个"BASE64加密源码完整JAR包"很可能包含了一个或者多个Java类,提供了方便的BASE64编码接口,便于开发者集成到他们的项目中。 在Java中,`java.util.Base64`类库提供了以下主要方法: 1. `Encoder....

    Delphi源码,图片转base64及base64转图片函数

    function Base64ToImage(const base64:string;AImage:TImage):Boolean; function Base64ToImageFile(const base64:string;AImagefile:string):Boolean; function CheckImgTypeBase64(abase64:string):string;

    基于java BASE64Decoder 算法实现数据库账号的加密解密的源码-EncryptAndDecryption.zip

    这个类提供了`Decoder`和`Encoder`接口,其中`Base64.Decoder`用于解码BASE64编码的数据,而`Base64.Encoder`用于编码数据。 对于数据库账号的加密,我们首先需要获取账号信息,然后使用一个密钥(key)进行加密。...

    BASE64All源码与jar包

    在你提到的压缩包"BASE64All源码与jar包"中,可能包含了一个实现了BASE64编码和解码功能的第三方库,以及相关的源代码。这个库可能提供了更高级的功能,比如批量处理、支持流式操作或者错误处理。使用这样的库,...

    Base64加解密源码-java

    Base64.Decoder decoder = Base64.getDecoder(); ``` 2. **对字符串进行Base64编码**: ```java String originalStr = "Hello, World!"; byte[] encodedBytes = encoder.encode(originalStr.getBytes...

    Base64JAVA实现源码

    `Encoder`和`Decoder`用于标准的Base64编码,而`UrlSafeEncoder/Decoder`则用于URL和文件名安全的Base64编码,它将"+"替换为"-","/"替换为"_"。 1. 使用`java.util.Base64`编码: ```java import java.util.Base64...

    java实现base64加密

    对应地,使用`java.util.Base64.Decoder`接口的`decode()`方法可以将Base64字符串解码回原始的字节数组。例如: ```java String encodedString = "SGVsbG8sIFdvcmxkIQ=="; byte[] decodedBytes = Base64....

    BASE64源码及JAR包

    在Java中,`sun.misc.BASE64Encoder`是早期用于实现BASE64编码的一个类,但请注意,这个类并不是Java标准API的一部分,而是属于Sun Microsystems提供的非公开、非标准的类库,因此在新的Java版本中,建议使用`java....

    sun base64解码实现

    3. **使用`sun.misc.BASE64Decoder`类**:在Java 8之前的版本中,Sun JDK提供了一个内部类`sun.misc.BASE64Decoder`,可以用于Base64解码。但是,这个类并不是公开API的一部分,因此使用它可能会导致不兼容性问题。...

    Base64 编码程序源代码

    3. `Base64Encoder`和`Base64Decoder`类:可能提供了更高级的功能,如流式编码和解码,允许用户分批处理大文件或流数据。 在编码过程中,如果原始数据不是3的倍数,会在末尾添加0填充位,以达到24位的整数倍。编码...

Global site tag (gtag.js) - Google Analytics