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中是一项基本操作,可以方便地处理二进制数据与文本数据之间的转换。同时,结合加密技术,我们可以创建安全的数据传输和存储方案。在开发过程中,了解并熟练运用这些工具,能够提升代码的...
在Java中,可以使用`javax.imageio.ImageIO`和`java.util.Base64`两个库来实现这个功能。以下是转换的代码片段: ```java import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io....
为了实现解码功能,可以使用Java 8以后提供的`java.util.Base64`类,它提供了安全且推荐的Base64编码和解码功能。例如,要解码一个Base64字符串为字节数组,可以这样做: ```java import java.util.Base64; public...
如果你使用的是Apache Commons Codec库,引入依赖后,Base64编码可以这样实现: ```java import org.apache.commons.codec.binary.Base64; public class Base64Example { public static void main(String[] args)...
对于开发者来说,也可以使用各种编程语言(如Python、JavaScript、Java等)内置的库函数进行Base64操作,实现自动化处理。 总的来说,Base64编码是一种实用的二进制数据转换技术,广泛应用于网络通信和数据存储领域...
在图片处理中,BASE64编码常用来将图片数据转换为文本格式,便于在网络传输或存储时使用。 2. **Blob类型**:Blob是Binary Large Object的缩写,是数据库管理系统中用于存储大量二进制数据的字段类型,例如图片、...
在JavaScript中,可以使用`btoa`函数将二进制数据编码为base64,用`atob`函数将base64字符串解码回原始二进制数据。 三、后台还原图片 将前端压缩并编码的base64图片发送到服务器后,后台需要进行解码和保存操作。...
具体来说,Base64使用64个字符来代表二进制数据:A-Z、a-z、0-9、+、/,共64个。字符‘=’用于填充最后不足三个字节的数据,因为每三个字节会被编码为四个字符。 在Java Web应用开发中,可能会遇到需要在服务器端...
常见的编程语言如Python、JavaScript、Java等都有Base64编码和解码的实现。 4. **应用场景**:Base64编码通常用于在纯文本格式中嵌入图像或者任何其他非ASCII字符的数据,例如在HTML邮件、JSON数据中。在HTTP头信息...
CTF 58编码的加解密JAVA代码
总结来说,JS实现与Java相同编码效果的中文字符串UTF-8 Base64编码,关键在于理解字符编码和Base64编码原理,以及在JavaScript中处理非ASCII字符的特殊性。通过将UTF-16编码的中文字符串转换为UTF-8,然后应用Base64...
Java Base64解码错误是指在Java中使用Base64解码时出现的异常错误,通常是由于Base64解码的输入参数不正确或解码过程中出现问题所致。下面我们将详细分析Java Base64解码错误的原因和解决方法。 一、 Java Base64...
在腾讯云点播的场景下,开发人员可能会构建一个这样的系统,用户首先通过客户端上传经过BASE64编码的视频数据,然后服务端接收到数据后,使用`java.util.Base64` 解码并存储到云存储中,最后对视频进行转码、分发等...
在Java中,我们可以使用`sun.misc.BASE64Decoder`和`sun.misc.BASE64Encoder`这两个非标准类来完成Base64编码和解码。但需要注意的是,这些类并不包含在Java标准库中,它们属于Sun Microsystems提供的内部实现,可能...
编码器/解码器-Json / Base64自述文件此扩展用于将base64解码为格式化的json,并将json编码为base... 添加了将base64解码为json并将json编码为base64的功能使用Markdown 在macOS上打开命令面板Shift+CMD+P 将Command64
本篇文章将详细介绍几种常见的编码解码方式,包括Hex编码、Base64编码以及URL编码,并提供一个集成Apache Commons Codec、Commons Lang和Java JDK的实用工具类`EncodeUtils`。 ### 1. Hex编码与解码 Hex编码是一种...
接到webp图片的base64码转存为其他格式图片(如:png)的base64码上传服务器。其实就是将webp图片转为png图片而已,只是使用base64编码来体现。当然其中也可以生产图片,byte码均可实现
在Java 8及以后的版本中,可以使用`java.util.Base64`类进行Base64编码和解码。例如: ```java import java.util.Base64; public class Base64Example { public static void encodeBase64() { String chinese...
在接收到Base64编码的图片后,Java可以使用`java.util.Base64`类进行解码,并将解码后的字节数组保存为图片文件。此外,Java还可以处理图片的进一步压缩,例如使用ImageIO库来调整图片尺寸和质量。 这个...
### Java程序转码(UTF-8):详细解析与实现 #### 一、引言 在处理文本数据时,字符编码是一项重要的技术基础。不同系统、不同语言环境下的字符编码可能不一致,这就需要进行字符编码转换以确保数据正确显示和处理...