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

Base64Encoder源码

    博客分类:
  • Java
 
阅读更多

import java.io.*;

/*******************************************************************************
 * A class to encode Base64 streams and strings. See RFC 1521 section 5.2 for
 * details of the Base64 algorithm.
 * <p>
 * This class can be used for encoding strings: <blockquote>
 * 
 * <pre>
 * String unencoded = &quot;webmaster:try2gueSS&quot;;
 * String encoded = Base64Encoder.encode(unencoded);
 * </pre>
 * 
 * </blockquote> or for encoding streams: <blockquote>
 * 
 * <pre>
 * OutputStream out = new Base64Encoder(System.out);
 * </pre>
 * 
 * </blockquote>
 * 
 * @author <b>Jason Hunter</b>, Copyright &#169; 2000
 * @version 1.2, 2002/11/01, added encode(byte[]) method to better handle binary
 *          data (thanks to Sean Graham)
 * @version 1.1, 2000/11/17, fixed bug with sign bit for char values
 * @version 1.0, 2000/06/11
 */
public class Base64Encoder extends FilterOutputStream {

	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', '+', '/' };

	private int charCount;
	private int carryOver;

	/***************************************************************************
	 * Constructs a new Base64 encoder that writes output to the given
	 * OutputStream.
	 * 
	 * @param out
	 *            the output stream
	 */
	public Base64Encoder(OutputStream out) {
		super(out);
	}

	/***************************************************************************
	 * Writes the given byte to the output stream in an encoded form.
	 * 
	 * @exception IOException
	 *                if an I/O error occurs
	 */
	public void write(int b) throws IOException {
		// Take 24-bits from three octets, translate into four encoded chars
		// Break lines at 76 chars
		// If necessary, pad with 0 bits on the right at the end
		// Use = signs as padding at the end to ensure encodedLength % 4 == 0

		// Remove the sign bit,
		// thanks to Christian Schweingruber <chrigu@lorraine.ch>
		if (b < 0) {
			b += 256;
		}

		// First byte use first six bits, save last two bits
		if (charCount % 3 == 0) {
			int lookup = b >> 2;
			carryOver = b & 3; // last two bits
			out.write(chars[lookup]);
		}
		// Second byte use previous two bits and first four new bits,
		// save last four bits
		else if (charCount % 3 == 1) {
			int lookup = ((carryOver << 4) + (b >> 4)) & 63;
			carryOver = b & 15; // last four bits
			out.write(chars[lookup]);
		}
		// Third byte use previous four bits and first two new bits,
		// then use last six new bits
		else if (charCount % 3 == 2) {
			int lookup = ((carryOver << 2) + (b >> 6)) & 63;
			out.write(chars[lookup]);
			lookup = b & 63; // last six bits
			out.write(chars[lookup]);
			carryOver = 0;
		}
		charCount++;

		// Add newline every 76 output chars (that's 57 input chars)
		if (charCount % 57 == 0) {
			out.write('\n');
		}
	}

	/***************************************************************************
	 * Writes the given byte array to the output stream in an encoded form.
	 * 
	 * @param buf
	 *            the data to be written
	 * @param off
	 *            the start offset of the data
	 * @param len
	 *            the length of the data
	 * @exception IOException
	 *                if an I/O error occurs
	 */
	public void write(byte[] buf, int off, int len) throws IOException {
		// This could of course be optimized
		for (int i = 0; i < len; i++) {
			write(buf[off + i]);
		}
	}

	/***************************************************************************
	 * Closes the stream, this MUST be called to ensure proper padding is
	 * written to the end of the output stream.
	 * 
	 * @exception IOException
	 *                if an I/O error occurs
	 */
	public void close() throws IOException {
		// Handle leftover bytes
		if (charCount % 3 == 1) { // one leftover
			int lookup = (carryOver << 4) & 63;
			out.write(chars[lookup]);
			out.write('=');
			out.write('=');
		} else if (charCount % 3 == 2) { // two leftovers
			int lookup = (carryOver << 2) & 63;
			out.write(chars[lookup]);
			out.write('=');
		}
		super.close();
	}

	/***************************************************************************
	 * Returns the encoded form of the given unencoded string. The encoder uses
	 * the ISO-8859-1 (Latin-1) encoding to convert the string to bytes. For
	 * greater control over the encoding, encode the string to bytes yourself
	 * and use encode(byte[]).
	 * 
	 * @param unencoded
	 *            the string to encode
	 * @return the encoded form of the unencoded string
	 */
	public static String encode(String unencoded) {
		byte[] bytes = null;
		try {
			bytes = unencoded.getBytes("8859_1");
		} catch (UnsupportedEncodingException ignored) {
		}
		return encode(bytes);
	}

	/***************************************************************************
	 * Returns the encoded form of the given unencoded string.
	 * 
	 * @param bytes
	 *            the bytes to encode
	 * @return the encoded form of the unencoded string
	 */
	public static String encode(byte[] bytes) {
		ByteArrayOutputStream out = new ByteArrayOutputStream((int) (bytes.length * 1.37));
		Base64Encoder encodedOut = new Base64Encoder(out);

		try {
			encodedOut.write(bytes);
			encodedOut.close();

			return out.toString("8859_1");
		} catch (IOException ignored) {
			return null;
		}
	}

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

		Base64Encoder encoder = null;
		BufferedInputStream in = null;
		try {
			encoder = new Base64Encoder(System.out);
			in = new BufferedInputStream(new FileInputStream(args[0]));

			byte[] buf = new byte[4 * 1024]; // 4K buffer
			int bytesRead;
			while ((bytesRead = in.read(buf)) != -1) {
				encoder.write(buf, 0, bytesRead);
			}
		} finally {
			if (in != null)
				in.close();
			if (encoder != null)
				encoder.close();
		}
	}
}
 
分享到:
评论
2 楼 guoranaccp 2016-04-06  
太帅了
1 楼 lyfi 2012-08-02  

相关推荐

    sun.misc.BASE64Encoder源码及jar包

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

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

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

    BASE64Encoder 与 BASE64Decoder 源代码

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

    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包 以及...

    java base64源码+jar包

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

    BASE64加密源码完整JAR包

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

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

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

    BASE64源码及JAR包

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

    BASE64All源码与jar包

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

    Base64加解密源码-java

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

    Base64JAVA实现源码

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

    java实现base64加密

    使用`java.util.Base64.Encoder`接口的`encodeToString()`方法可以将字节数组编码为Base64字符串。例如: ```java byte[] bytes = "Hello, World!".getBytes(StandardCharsets.UTF_8); String encodedString = ...

    Base64算法完整源码与调用方法

    如上所述,Python使用`base64.b64encode()`和`base64.b64decode()`,Java使用`Base64.getEncoder().encode()`和`Base64.getDecoder().decode()`,JavaScript使用全局函数`btoa()`和`atob()`。在C#中,可以使用`...

    base64与任何格式的图片互转源码 可运行

    `encodeImageToBase64()`方法读取指定路径的图片文件,将其内容转换为字节数组,然后使用`Base64.getEncoder().encodeToString()`编码为Base64字符串。相反,`decodeBase64ToImage()`方法接收一个Base64字符串,解码...

    base64编码译码器_C语言源码_多种实现

    Base64编码是一种在互联网上广泛使用的数据编码方式,它将任意二进制数据转换成可打印的ASCII字符,主要用于在网络上传输包含非ASCII字符的数据,例如图片、文本等。这种编码方法基于64个可打印字符,这些字符包括大...

    java模拟实现base64算法的编码过程

    在Java中,可以使用`java.util.Base64`类库提供的API来实现Base64编码,但如果你希望手动实现这个过程,可以创建一个`Base64Encoder`类,包含上述步骤的函数,例如`encodeBytes(byte[])`。 下面是一个简单的手动...

    Base64 编码程序源代码

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

    base64加密解密的hive udf函数

    return new Text(Base64.getEncoder().encodeToString(bytes)); } else { // Base64解密 if (input.isEmpty()) return input; try { byte[] decodedBytes = Base64.getDecoder().decode(input); return new ...

    java实现SHA1、SHA、MD5、AES加密、AES解密、BASE64解密、BASE64加密,以及BASE64 jar和源码

    Java标准库提供`java.util.Base64`类,包括`Encoder`和`Decoder`接口,用于进行BASE64的编码和解码操作。 5. **Apache Commons Codec**: 这个库也提供了BASE64编码和解码功能,可能更易用且功能更丰富。例如,`org....

Global site tag (gtag.js) - Google Analytics