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 : [/1/4 16:43]* @updateUser : [17151]* @updateTime : [/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;}//将十进制转换成base64public 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);}}