`
shoukii0721
  • 浏览: 79825 次
社区版块
存档分类
最新评论

用Java实现Base64的编码与转码

 
阅读更多
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME, 在XML中存储复杂数据.

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,因此, 转换后的字节一定会落在区间[0-64)当中,故此可以找到对应基本字符表示此字节,转换后的字符串理论上将要比原来的长1/3。



public class Base64 {

	/** The 64 valid Base64 characters */
	private final static char[] BASE64_ALPHABET = { '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', '+', '/' };

	/** The BASE64 suffix code */
	private static final byte SUFFIX_CODE = '=';

	private Base64() {
	}

	/**
	 * Encode a byte array into BASE64 string.
	 * 
	 * @param a
	 *            the source byte array
	 * @return BASE64 string
	 */
	public static String encode(byte[] a) {
		int length = a.length;
		int numOfGroups = length / 3;
		int remainingBytes = length - numOfGroups * 3;
		int resultLength = 4 * ((length + 2) / 3);
		char[] result = new char[resultLength];
		int srcIndex = 0, dstIndex = 0;

		for (int i = 0; i < numOfGroups; i++) {
			int byte0 = a[srcIndex++] & 0xff;
			int byte1 = a[srcIndex++] & 0xff;
			int byte2 = a[srcIndex++] & 0xff;
			result[dstIndex++] = BASE64_ALPHABET[byte0 >> 2];
			result[dstIndex++] = BASE64_ALPHABET[(byte0 << 4) & 0x30
					| (byte1 >> 4)];
			result[dstIndex++] = BASE64_ALPHABET[(byte1 << 2) & 0x3c
					| (byte2 >> 6)];
			result[dstIndex++] = BASE64_ALPHABET[byte2 & 0x3f];
		}

		// Process the remaining bytes
		if (remainingBytes > 0) {
			int byte0 = a[srcIndex++] & 0xff;
			result[dstIndex++] = BASE64_ALPHABET[byte0 >> 2];
			if (remainingBytes == 1) {
				result[dstIndex++] = BASE64_ALPHABET[(byte0 << 4) & 0x30];
				result[dstIndex++] = SUFFIX_CODE;
				result[dstIndex++] = SUFFIX_CODE;
			} else {
				// remainingBytes == 2;
				int byte1 = a[srcIndex++] & 0xff;
				result[dstIndex++] = BASE64_ALPHABET[(byte0 << 4) & 0x30
						| (byte1 >> 4)];
				result[dstIndex++] = BASE64_ALPHABET[(byte1 << 2) & 0x3f];
				result[dstIndex++] = SUFFIX_CODE;
			}
		}
		return new String(result);
	}

	/**
	 * Decode a BASE64 string into byte array.
	 * 
	 * @param s
	 *            BASE64 string
	 * @return the original byte array
	 */
	public static byte[] decode(String s) {
		if (s == null || s.length() == 0) {
			return null;
		}

		int length = s.length();
		// length must be a multiple of 4
		if (length % 4 != 0) {
			throw new IllegalArgumentException(
					"String length must be a multiple of four.");
		}

		int numOfGroups = length / 4;
		int numOfFullGroups = numOfGroups;
		int numOfPaddings = 0;
		if (s.charAt(length - 1) == SUFFIX_CODE) {
			numOfPaddings++;
			numOfFullGroups--;
			if (s.charAt(length - 2) == SUFFIX_CODE) {
				numOfPaddings++;
			}
		}
		byte[] result = new byte[3 * numOfGroups - numOfPaddings];

		int srcIndex = 0, dstIndex = 0;
		for (int i = 0; i < numOfFullGroups; i++) {
			int ch0 = getCharIndex(s.charAt(srcIndex++));
			int ch1 = getCharIndex(s.charAt(srcIndex++));
			int ch2 = getCharIndex(s.charAt(srcIndex++));
			int ch3 = getCharIndex(s.charAt(srcIndex++));

			result[dstIndex++] = (byte) ((ch0 << 2) | (ch1 >> 4));
			result[dstIndex++] = (byte) ((ch1 << 4) | (ch2 >> 2));
			result[dstIndex++] = (byte) ((ch2 << 6) | ch3);
		}

		if (numOfPaddings != 0) {
			int ch0 = getCharIndex(s.charAt(srcIndex++));
			int ch1 = getCharIndex(s.charAt(srcIndex++));
			result[dstIndex++] = (byte) ((ch0 << 2) | (ch1 >> 4));
			if (numOfPaddings == 1) {
				int ch2 = getCharIndex(s.charAt(srcIndex++));
				result[dstIndex++] = (byte) ((ch1 << 4) | (ch2 >> 2));
			}
		}

		return result;
	}

	/**
	 * Get the index of the character in the BASE64_ALPHABET array.
	 * 
	 * @param c
	 * @return
	 */
	private static int getCharIndex(char c) {
		if (c >= 'A' && c <= 'Z') { // A-Z: 65-90
			return (int) c - 65;
		} else if (c >= 'a' && c <= 'z') { // a-z: 97-122
			return (int) c - 71;
		} else if (c >= '0' && c <= '9') {// 0-9: 48-57
			return (int) c + 4;
		} else if (c == '+') {
			return 62;
		} else if (c == '/') {
			return 63;
		}
		throw new IllegalArgumentException("Character " + c
				+ " is not a BASE64 char");
	}

	public static void main(String[] args) {
		
		String str= "あいうえおabcde";
		String buf = encode(str.getBytes());
		System.out.println(buf);
		byte[] result = decode(buf);
		System.out.println(new String(result));
	}

}


分享到:
评论

相关推荐

    base64转码解密成明文加密成Java密文

    总的来说,Base64转码在Java中是一项基本操作,可以方便地处理二进制数据与文本数据之间的转换。同时,结合加密技术,我们可以创建安全的数据传输和存储方案。在开发过程中,了解并熟练运用这些工具,能够提升代码的...

    java生成二维码_java将二维码转换成base64

    在Java中,可以使用`javax.imageio.ImageIO`和`java.util.Base64`两个库来实现这个功能。以下是转换的代码片段: ```java import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io....

    图片转码BASE64Decoder.jar

    为了实现解码功能,可以使用Java 8以后提供的`java.util.Base64`类,它提供了安全且推荐的Base64编码和解码功能。例如,要解码一个Base64字符串为字节数组,可以这样做: ```java import java.util.Base64; public...

    Base64引入包

    如果你使用的是Apache Commons Codec库,引入依赖后,Base64编码可以这样实现: ```java import org.apache.commons.codec.binary.Base64; public class Base64Example { public static void main(String[] args)...

    base64转码器.zip

    对于开发者来说,也可以使用各种编程语言(如Python、JavaScript、Java等)内置的库函数进行Base64操作,实现自动化处理。 总的来说,Base64编码是一种实用的二进制数据转换技术,广泛应用于网络通信和数据存储领域...

    前端图片压缩base64后台还原图片

    在JavaScript中,可以使用`btoa`函数将二进制数据编码为base64,用`atob`函数将base64字符串解码回原始二进制数据。 三、后台还原图片 将前端压缩并编码的base64图片发送到服务器后,后台需要进行解码和保存操作。...

    Java 和 JavaScript 真正通用的Base64编码详解

    具体来说,Base64使用64个字符来代表二进制数据:A-Z、a-z、0-9、+、/,共64个。字符‘=’用于填充最后不足三个字节的数据,因为每三个字节会被编码为四个字符。 在Java Web应用开发中,可能会遇到需要在服务器端...

    base64转码工具

    常见的编程语言如Python、JavaScript、Java等都有Base64编码和解码的实现。 4. **应用场景**:Base64编码通常用于在纯文本格式中嵌入图像或者任何其他非ASCII字符的数据,例如在HTML邮件、JSON数据中。在HTTP头信息...

    图片BASE64加密保存到数据库Blob类型中(放入数据库,并取出生成图片)

    在图片处理中,BASE64编码常用来将图片数据转换为文本格式,便于在网络传输或存储时使用。 2. **Blob类型**:Blob是Binary Large Object的缩写,是数据库管理系统中用于存储大量二进制数据的字段类型,例如图片、...

    Base58.java

    CTF 58编码的加解密JAVA代码

    JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)

    总结来说,JS实现与Java相同编码效果的中文字符串UTF-8 Base64编码,关键在于理解字符编码和Base64编码原理,以及在JavaScript中处理非ASCII字符的特殊性。通过将UTF-16编码的中文字符串转换为UTF-8,然后应用Base64...

    sun.misc.BASE64Decoder

    在腾讯云点播的场景下,开发人员可能会构建一个这样的系统,用户首先通过客户端上传经过BASE64编码的视频数据,然后服务端接收到数据后,使用`java.util.Base64` 解码并存储到云存储中,最后对视频进行转码、分发等...

    Java Base64解码错误及解决方法

    Java Base64解码错误是指在Java中使用Base64解码时出现的异常错误,通常是由于Base64解码的输入参数不正确或解码过程中出现问题所致。下面我们将详细分析Java Base64解码错误的原因和解决方法。 一、 Java Base64...

    实例详解Java实现图片与base64字符串之间的转换

    在Java中,我们可以使用`sun.misc.BASE64Decoder`和`sun.misc.BASE64Encoder`这两个非标准类来完成Base64编码和解码。但需要注意的是,这些类并不包含在Java标准库中,它们属于Sun Microsystems提供的内部实现,可能...

    json-base64-vscode:解码base64以格式化json并将json编码为base64

    编码器/解码器-Json / Base64自述文件此扩展用于将base64解码为格式化的json,并将json编码为base... 添加了将base64解码为json并将json编码为base64的功能使用Markdown 在macOS上打开命令面板Shift+CMD+P 将Command64

    各种格式的编码解码工具类分享(hex解码 base64编码)

    本篇文章将详细介绍几种常见的编码解码方式,包括Hex编码、Base64编码以及URL编码,并提供一个集成Apache Commons Codec、Commons Lang和Java JDK的实用工具类`EncodeUtils`。 ### 1. Hex编码与解码 Hex编码是一种...

    webp图片格式转码 java 完整测试类+jar包

    接到webp图片的base64码转存为其他格式图片(如:png)的base64码上传服务器。其实就是将webp图片转为png图片而已,只是使用base64编码来体现。当然其中也可以生产图片,byte码均可实现

    java的api中文转码示例

    在Java 8及以后的版本中,可以使用`java.util.Base64`类进行Base64编码和解码。例如: ```java import java.util.Base64; public class Base64Example { public static void encodeBase64() { String chinese...

    JS选取图片压缩转码例子及完整源码(JAVA)

    在接收到Base64编码的图片后,Java可以使用`java.util.Base64`类进行解码,并将解码后的字节数组保存为图片文件。此外,Java还可以处理图片的进一步压缩,例如使用ImageIO库来调整图片尺寸和质量。 这个...

    Java 程序转码(UTF-8)

    ### Java程序转码(UTF-8):详细解析与实现 #### 一、引言 在处理文本数据时,字符编码是一项重要的技术基础。不同系统、不同语言环境下的字符编码可能不一致,这就需要进行字符编码转换以确保数据正确显示和处理...

Global site tag (gtag.js) - Google Analytics