Base64(基底64)是一种基于64个可打印字符来表示二进制数据的表示方法。一些如uuencode的其他编码方法,和之后BinHex的版本使用不同的64字符集来代表6个二进制数字,但是不被称为Base64。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
但是目前我的代码只能完成字符串和Base64之间的转换!
代码如下:
方法一:
package Day1_4;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @author : [17151]
* @version : [v1.0]
* @description : [将字符串转换成base64]
* @createTime : [2022/1/4 16:43]
* @updateUser : [17151]
* @updateTime : [2022/1/4 16:43]
* @updateRemark : [说明本次修改内容]
* 1、先及那个字符串转换成二进制码
* 2、再将二进制码六个为一组存到数组中
* 3、将数组中的二进制转化成base64格式
* 4、最后输出结果
*/
public class Base64 {
public static void main(String[] args) {
String str = "奥里给";
//System.out.println(to2(str));
//System.out.println(save(str));
System.out.println(toBase64(str));
System.out.println(new String(java.util.Base64.getEncoder().encode(str.getBytes())));
}
//将字符串转换成二进制
public static String to2(String str) {
byte[] bytes = str.getBytes();
System.out.println(bytes.length);
String result = "";
for (byte b : bytes) {
result += getBinaryStrFromByte(b);
}
System.out.println(result.length());
if ((result.length() % 6) != 0) {
for (int i = 0; i < (result.length() % 6); i++) {
result += 0;
}
}
return result;
}
public static String getBinaryStrFromByte(byte b) {
String result = "";
byte a = b;
for (int i = 0; i < 8; i++) {
byte c = a;
a = (byte) (a >> 1);//每移一位如同将10进制数除以2并去掉余数。
a = (byte) (a << 1);
if (a == c) {
result = "0" + result;
} else {
result = "1" + result;
}
a = (byte) (a >> 1);
}
return result;
}
//将二进制以每六位储存
public static List save(String str) {
String result = to2(str);
List<String> list = new ArrayList<>();
for (int i = 0; i < result.length(); i += 6) {
list.add(result.substring(i, i + 6));
}
return list;
}
//将十进制转换成base64
public static String toBase64(String str) {
List<String> list1 = save(str);
char[] ch = new char[]{'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', 'g', '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', '+', '/'};
String newstr = "";
for (String li : list1) {
Integer num = Integer.parseInt(li, 2);
newstr = newstr + ch[num];
}
return newstr;
}
}

方法二:比方法一简洁很多
package Day1_5;
public class Base2 {
static char []ch = new char[]{'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','g','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','+','/'};
public static void main(String[] args) {
String org = "奥里给";
toto(org);
System.out.println(new String(java.util.Base64.getEncoder().encode(org.getBytes())));
}
public static void toto(String str){
byte[] bytes = str.getBytes();
System.out.println(bytes.length);
String newstr = "";
int ys = bytes.length % 3;//余数
for (int i = 0; i < bytes.length-ys; i+=3) {
int v = ((bytes[i] & 0xFF) << 16) | ((bytes[i+1] & 0xFF) << 8) |(bytes[i+2] & 0xFF);
int d3 = v & 0x3F;
int d2 = v >>> 6 & 0x3F;
int d1 = v >>> 12 & 0x3F;
int d0 = v >>> 18 & 0x3F;
newstr = newstr+ch[d0]+ch[d1]+ch[d2]+ch[d3];
}
if(ys==1){
byte b = bytes[bytes.length-1];
newstr += ch[(b & 0xFF) >>> 2];
newstr += ch[((b & 0xFF) << 4 & 0x3F)];
newstr += "==";
}else if(ys==2){
int b = ((bytes[bytes.length-2] & 0xFF) << 8) | (bytes[bytes.length-1] & 0xFF);
newstr += ch[b >>> 10 & 0x3F];
newstr += ch[b >>> 4 & 0x3F];
newstr += ch[b << 2 & 0x3F];
newstr += "=";
}
System.out.println(newstr);
}
}











