java base64编码、解码的三种方式
1.用法介绍
方式一:DatatypeConverter
说明:使用jdk自带的DatatypeConverter.java类实现,但是jdk版本必须>=1.6。
import java.io.UnsupportedEncodingException;
import javax.xml.bind.DatatypeConverter;
编码
/**
* base64编码之方法一
* @explain DatatypeConverter.java实现
* @param str
* 待编码字符串
* @return 编码字符串
*/
public static String encode(String str) {
// base64字符串
String base64Str = "" ;
try {
// String-->byte[]
byte [] data = str.getBytes("utf-8" );
// 编码
base64Str = DatatypeConverter.printBase64Binary(data);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return base64Str;
}
解码
/**
* base64解码之方法一
* @explain DatatypeConverter.java实现
* @param base64Str
* 待解码字符串
* @return 解码字符串
*/
public static String decode(String base64Str) {
// 解码后的字符串
String str = "" ;
// 解码
byte [] base64Data = DatatypeConverter.parseBase64Binary(base64Str);
try {
// byte[]-->String
str = new String(base64Data, "utf-8" );
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return str;
}
方式二:Base64
说明:使用jdk自带的Base64.java类实现,但是jdk版本必须>=1.8。
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.nio.charset.StandardCharsets;
编码
/**
* base64编码之方法二
* @explain Base64.java实现
* @param str
* 待编码字符串
* @return 编码字符串
*/
public static String encode2(String str) {
// String-->byte[]
byte [] data = str.getBytes(StandardCharsets.UTF_8);
// 编码(base64字符串)
String base64Str = Base64.getEncoder().encodeToString(data);
return base64Str;
}
解码
/**
* base64解码之方法二
* @explain Base64.java实现
* @param base64Str
* 待解码字符串
* @return 解码字符串
*/
public static String decode2(String base64Str) {
// 解码
byte [] base64Data = Base64.getDecoder().decode(base64Str);
// byte[]-->String(解码后的字符串)
String str = new String(base64Data, StandardCharsets.UTF_8);
return str;
}
方式三:Base64
所需jar包:commons-codec.jar
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;
编码
/**
* base64编码之方法三
* @explain Base64.java实现
* @param str
* 待编码字符串
* @return 编码字符串
*/
public static String encode3(String str) {
// String-->byte[]
byte [] data = str.getBytes(StandardCharsets.UTF_8);
// 编码(base64字符串)
String base64Str =Base64.encodeBase64String(data).replaceAll("\r\n" , "");
return base64Str;
}
解码
/**
* base64解码之方法三
* @explain Base64.java实现
* @param base64Str
* 待解码字符串
* @return 解码字符串
*/
public static String decode3(String base64Str) {
// 解码
byte [] base64Data = Base64.decodeBase64(base64Str);
// byte[]-->String(解码后的字符串)
String str = new String(base64Data, StandardCharsets.UTF_8);
return str;
}
2022年9月23日10:21:00
/*
* base64编码(不补位)
* @explain: 不进行多余的=填充
* @date: 2020年07月13日 0013 10:39
* @param: str
* @return: java.lang.String base码
*/
@NotNull
public static String encodeURLSafe(String str) {
if (StringUtils.isEmpty(str)) return "";
log.debug("base64待编码字符串:\n" + str);
// 字符串转base64
byte[] byteArray = str.getBytes(StandardCharsets.UTF_8);
// 编码
String result = encodeURLSafe(byteArray);
log.debug("base64编码结果:\n" + result);
return result;
}
/*
* 二进制转base64
* @description: 3位一组,当最后一组不足3位时,不用=号填充
* @date: 2022/3/1 21:00
* @param: bytes
* @return: java.lang.String
*/
@NotNull
public static String encodeURLSafe(byte[] bytes) {
if (ByteUtils.isEmpty(bytes)) return "";
return Base64.encodeBase64URLSafeString(bytes);
}
20200824
方式四:
所需jar包:tomcat-coyote.jar
编码与解码方式与方式三一样,这里不再赘述。
20200827
方式五:
所需jar包:spring-core.jar
用法大同小异,不再赘述。
2022年9月22日18:21:42
方式五,不能将解决自动补位的问题
String str = "Marydon";
System.out.println(org.springframework.util.Base64Utils.encodeToUrlSafeString(str.getBytes(StandardCharsets.UTF_8)));
另外,需要说明的是关于base64编码与解码的方式不只有这几种方式, 一般情况下,只有jar包中集成的base64相关的class类,就可以直接导包引用。
2.测试
public static void main(String[] args) {
String str = "http://www.cnblogs.com/Marydon20170307" ;
String base64 = Base64Utils.encode(str); // aHR0cDovL3d3dy5jbmJsb2dzLmNvbS9NYXJ5ZG9uMjAxNzAzMDc=
System.out.println(base64);
String str2 = Base64Utils.decode(base64);
System.out.println(str.equals(str2)); // true
}
3.效率比较
快-->慢:方式二 > 方式一 > 方式三
因此,如果项目用的是jdk1.8,最佳选择是方式二;jdk1.6,最佳选择是方式一。
20200824
4.只知其一不知其二
用了这么久的base64,但是,在前段时间的接口对接过程中,却因为它栽了跟头,有必要进行一次总结回顾。
base64,我们通常的用途有两种:第一种,图片转码;第二种,作为数据加密的方式、步骤之一。
encodeBase64和encodeBase64URLSafe
一般情况下,我们只用到了第一个,没有用到第二个,绝大部分人用的也是第一个,网站在线解析也是如此,这就造成了我们只知其一不知其二。
二者区别:
encodeBase64会对字符串3位一组自动补全,因而最后可能会出现 == 或者 =(缺一个补一个=,缺两个补两个=);
encodeBase64URLSafe则是按照字符串实际位数进行加密,不补全,不会出现 == 或者 =
举个例子:
待编码字符串:Marydon,编码后分别是:TWFyeWRvbg、TWFyeWRvbg==。
上面的区别介绍是从网上找到的,但并没有说全,再看另外两个例子
待编码字符串:
{ "RegionCode" : "410000" , "IvcAgcCode" : "507403" , "Items" :[{ "ItemCode" : "913001001" , "ItemName" : "诊察费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "诊察费" }]},{ "ItemCode" : "913001002" , "ItemName" : "检查费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "检查费" }]},{ "ItemCode" : "913001003" , "ItemName" : "化验费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "化验费" }]},{ "ItemCode" : "913001004" , "ItemName" : "治疗费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "治疗费" }]},{ "ItemCode" : "913001005" , "ItemName" : "手术费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "手术费" }]},{ "ItemCode" : "913001006" , "ItemName" : "卫生材料费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "卫生材料费" }]},{ "ItemCode" : "913001007" , "ItemName" : "西药费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "西药费" }]},{ "ItemCode" : "913001008" , "ItemName" : "中药饮片" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "中药饮片" }]},{ "ItemCode" : "913001009" , "ItemName" : "中成药费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "中成药费" }]},{ "ItemCode" : "913001010" , "ItemName" : "挂号费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "挂号费" }]},{ "ItemCode" : "913001011" , "ItemName" : "一般诊疗费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "一般诊疗费" }]},{ "ItemCode" : "913001012" , "ItemName" : "其他门诊费" , "IvcType" : "1" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "其他门诊费" }]},{ "ItemCode" : "913002001" , "ItemName" : "床位费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "床位费" }]},{ "ItemCode" : "913002002" , "ItemName" : "诊察费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "诊察费" }]},{ "ItemCode" : "913002003" , "ItemName" : "检查费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "检查费" }]},{ "ItemCode" : "913002004" , "ItemName" : "化验费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "化验费" }]},{ "ItemCode" : "913002005" , "ItemName" : "治疗费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "治疗费" }]},{ "ItemCode" : "913002006" , "ItemName" : "手术费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "手术费" }]},{ "ItemCode" : "913002007" , "ItemName" : "护理费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "护理费" }]},{ "ItemCode" : "913002008" , "ItemName" : "卫生材料费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "卫生材料费" }]},{ "ItemCode" : "913002009" , "ItemName" : "西药费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "西药费" }]},{ "ItemCode" : "913002010" , "ItemName" : "中药饮片" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "中药饮片" }]},{ "ItemCode" : "913002011" , "ItemName" : "中成药费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "中成药费" }]},{ "ItemCode" : "913002012" , "ItemName" : "一般诊疗费" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "一般诊疗费" }]},{ "ItemCode" : "913002013" , "ItemName" : "其他住院费用" , "IvcType" : "2" , "Stands" :[{ "UpLimit" : 0 , "StandCode" : "001" , "LowerLimit" : 0 , "Unit" : "元" , "StandName" : "其他住院费用" }]}]}
encodeBase64编码结果:
eyJSZWdpb25Db2RlIjoiNDEwMDAwIiwiSXZjQWdjQ29kZSI6IjUwNzQwMyIsIkl0ZW1zIjpbeyJJdGVtQ29kZSI6IjkxMzAwMTAwMSIsIkl0ZW1OYW1lIjoi6K+K5a+f6LS5IiwiSXZjVHlwZSI6IjEiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLor4rlr5/otLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDEwMDIiLCJJdGVtTmFtZSI6IuajgOafpei0uSIsIkl2Y1R5cGUiOiIxIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5qOA5p+l6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAxMDAzIiwiSXRlbU5hbWUiOiLljJbpqozotLkiLCJJdmNUeXBlIjoiMSIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6IuWMlumqjOi0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMTAwNCIsIkl0ZW1OYW1lIjoi5rK755aX6LS5IiwiSXZjVHlwZSI6IjEiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLmsrvnlpfotLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDEwMDUiLCJJdGVtTmFtZSI6IuaJi+acr+i0uSIsIkl2Y1R5cGUiOiIxIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5omL5pyv6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAxMDA2IiwiSXRlbU5hbWUiOiLljavnlJ/mnZDmlpnotLkiLCJJdmNUeXBlIjoiMSIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6IuWNq+eUn+adkOaWmei0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMTAwNyIsIkl0ZW1OYW1lIjoi6KW/6I2v6LS5IiwiSXZjVHlwZSI6IjEiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLopb/oja/otLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDEwMDgiLCJJdGVtTmFtZSI6IuS4reiNr+mlrueJhyIsIkl2Y1R5cGUiOiIxIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5Lit6I2v6aWu54mHIn1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAxMDA5IiwiSXRlbU5hbWUiOiLkuK3miJDoja/otLkiLCJJdmNUeXBlIjoiMSIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6IuS4reaIkOiNr+i0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMTAxMCIsIkl0ZW1OYW1lIjoi5oyC5Y+36LS5IiwiSXZjVHlwZSI6IjEiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLmjILlj7fotLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDEwMTEiLCJJdGVtTmFtZSI6IuS4gOiIrOiviueWl+i0uSIsIkl2Y1R5cGUiOiIxIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5LiA6Iis6K+K55aX6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAxMDEyIiwiSXRlbU5hbWUiOiLlhbbku5bpl6jor4rotLkiLCJJdmNUeXBlIjoiMSIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6IuWFtuS7lumXqOiviui0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMjAwMSIsIkl0ZW1OYW1lIjoi5bqK5L2N6LS5IiwiSXZjVHlwZSI6IjIiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLluorkvY3otLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDIwMDIiLCJJdGVtTmFtZSI6IuiviuWvn+i0uSIsIkl2Y1R5cGUiOiIyIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi6K+K5a+f6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAyMDAzIiwiSXRlbU5hbWUiOiLmo4Dmn6XotLkiLCJJdmNUeXBlIjoiMiIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6IuajgOafpei0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMjAwNCIsIkl0ZW1OYW1lIjoi5YyW6aqM6LS5IiwiSXZjVHlwZSI6IjIiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLljJbpqozotLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDIwMDUiLCJJdGVtTmFtZSI6Iuayu+eWl+i0uSIsIkl2Y1R5cGUiOiIyIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5rK755aX6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAyMDA2IiwiSXRlbU5hbWUiOiLmiYvmnK/otLkiLCJJdmNUeXBlIjoiMiIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6IuaJi+acr+i0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMjAwNyIsIkl0ZW1OYW1lIjoi5oqk55CG6LS5IiwiSXZjVHlwZSI6IjIiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLmiqTnkIbotLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDIwMDgiLCJJdGVtTmFtZSI6IuWNq+eUn+adkOaWmei0uSIsIkl2Y1R5cGUiOiIyIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5Y2r55Sf5p2Q5paZ6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAyMDA5IiwiSXRlbU5hbWUiOiLopb/oja/otLkiLCJJdmNUeXBlIjoiMiIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6Iuilv+iNr+i0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMjAxMCIsIkl0ZW1OYW1lIjoi5Lit6I2v6aWu54mHIiwiSXZjVHlwZSI6IjIiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLkuK3oja/ppa7niYcifV19LHsiSXRlbUNvZGUiOiI5MTMwMDIwMTEiLCJJdGVtTmFtZSI6IuS4reaIkOiNr+i0uSIsIkl2Y1R5cGUiOiIyIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5Lit5oiQ6I2v6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAyMDEyIiwiSXRlbU5hbWUiOiLkuIDoiKzor4rnlpfotLkiLCJJdmNUeXBlIjoiMiIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6IuS4gOiIrOiviueWl+i0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMjAxMyIsIkl0ZW1OYW1lIjoi5YW25LuW5L2P6Zmi6LS555SoIiwiSXZjVHlwZSI6IjIiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLlhbbku5bkvY/pmaLotLnnlKgifV19XX0K
encodeBase64URLSafe编码结果:
eyJSZWdpb25Db2RlIjoiNDEwMDAwIiwiSXZjQWdjQ29kZSI6IjUwNjQwMiIsIkl0ZW1zIjpbeyJJdGVtQ29kZSI6IjkxMzAwMTAwMiIsIkl0ZW1OYW1lIjoi5qOA5p-l6LS5IiwiSXZjVHlwZSI6IjEiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLmo4Dmn6XotLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDEwMDMiLCJJdGVtTmFtZSI6IuWMlumqjOi0uSIsIkl2Y1R5cGUiOiIyIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5YyW6aqM6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAxMDA0IiwiSXRlbU5hbWUiOiLmsrvnlpfotLkiLCJJdmNUeXBlIjoiMSIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6Iuayu-eWl-i0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMTAwNSIsIkl0ZW1OYW1lIjoi5omL5pyv6LS5IiwiSXZjVHlwZSI6IjIiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLmiYvmnK_otLkifV19LHsiSXRlbUNvZGUiOiI5MTMwMDEwMDYiLCJJdGVtTmFtZSI6IuWNq-eUn-adkOaWmei0uSIsIkl2Y1R5cGUiOiIyIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5Y2r55Sf5p2Q5paZ6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAxMDA3IiwiSXRlbU5hbWUiOiLopb_oja_otLkiLCJJdmNUeXBlIjoiMSIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6Iuilv-iNr-i0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMTAwOCIsIkl0ZW1OYW1lIjoi5Lit6I2v6aWu54mHIiwiSXZjVHlwZSI6IjEiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLkuK3oja_ppa7niYcifV19LHsiSXRlbUNvZGUiOiI5MTMwMDEwMDkiLCJJdGVtTmFtZSI6IuS4reaIkOiNr-i0uSIsIkl2Y1R5cGUiOiIyIiwiU3RhbmRzIjpbeyJVcExpbWl0IjowLCJTdGFuZENvZGUiOiIwMDEiLCJMb3dlckxpbWl0IjowLCJVbml0Ijoi5YWDIiwiU3RhbmROYW1lIjoi5Lit5oiQ6I2v6LS5In1dfSx7Ikl0ZW1Db2RlIjoiOTEzMDAxMDEwIiwiSXRlbU5hbWUiOiLmjILlj7fotLkiLCJJdmNUeXBlIjoiMSIsIlN0YW5kcyI6W3siVXBMaW1pdCI6MCwiU3RhbmRDb2RlIjoiMDAxIiwiTG93ZXJMaW1pdCI6MCwiVW5pdCI6IuWFgyIsIlN0YW5kTmFtZSI6IuaMguWPt-i0uSJ9XX0seyJJdGVtQ29kZSI6IjkxMzAwMTAxMSIsIkl0ZW1OYW1lIjoi5LiA6Iis6K-K55aX6LS5IiwiSXZjVHlwZSI6IjEiLCJTdGFuZHMiOlt7IlVwTGltaXQiOjAsIlN0YW5kQ29kZSI6IjAwMSIsIkxvd2VyTGltaXQiOjAsIlVuaXQiOiLlhYMiLCJTdGFuZE5hbWUiOiLkuIDoiKzor4rnlpfotLkifV19XX0
base64待编码字符串:
{ "Type" : 1 , "PayerPartyType" : "1" , "RegionCode" : "410000" , "SerialNumber" : "0000007519" , "IvcAgcCode" : "506402" , "MainExt" :{ "OtherPayAmount" : "0" , "MedicalDate" : "20190117" , "FundPayAmount" : "0" , "MedicalType" : "门诊" , "MedicalInsuranceType" : "新农合" , "AccountPayAmount" : "0" , "Gender" : "男" , "OwnPayAmount" : "15.00" , "SelfpaymentAmount" : "0" , "MedicalInsuranceID" : "104381991001" , "OrgType" : "综合医院" , "PatientNumber" : "1000100201" , "SelfpaymentCost" : "0" }, "PayerPartyName" : "马露" , "RepCreater" : "李四" , "Items" :[{ "ItemCode" : "9940301020" , "ItemRemark" :[], "ItemQuantity" : "1" , "Amount" : "10.00" , "ItemName" : "检查费" , "ItemStd" : "10.00" , "ItemUnit" :[], "AuxItem" :[{ "AuxItemQuantity" : "1" , "AuxItemAmount" : "10.0000" , "AuxItemStd" : "10.0000" , "AuxItemRelatedCode" : "9940301020" , "AuxItemUnit" : "人次" , "AuxItemRemark" : "无自付" , "AuxItemRelatedName" : "检查费" , "AuxItemName" : "角膜曲率检查" }]},{ "ItemCode" : "9940301070" , "ItemRemark" :[], "ItemQuantity" : "1" , "Amount" : "5.00" , "ItemName" : "西药费" , "ItemStd" : "5.00" , "ItemUnit" :[], "AuxItem" :[{ "AuxItemQuantity" : "1" , "AuxItemAmount" : "5.0000" , "AuxItemStd" : "5.0000" , "AuxItemRelatedCode" : "9940301070" , "AuxItemUnit" : "支" , "AuxItemRemark" : "无自付" , "AuxItemRelatedName" : "西药费" , "AuxItemName" : "复方托吡卡胺滴眼液" }]}], "TotalAmount" : "15.00" , "PayerPartyCode" :[]}
base64编码结果:
eyJUeXBlIjoxLCJQYXllclBhcnR5VHlwZSI6IjEiLCJSZWdpb25Db2RlIjoiNDEwMDAwIiwiU2VyaWFsTnVtYmVyIjoiMDAwMDAwNzUxOSIsIkl2Y0FnY0NvZGUiOiI1MDY0MDIiLCJNYWluRXh0Ijp7Ik90aGVyUGF5QW1vdW50IjoiMCIsIk1lZGljYWxEYXRlIjoiMjAxOTAxMTciLCJGdW5kUGF5QW1vdW50IjoiMCIsIk1lZGljYWxUeXBlIjoi6Zeo6K-KIiwiTWVkaWNhbEluc3VyYW5jZVR5cGUiOiLmlrDlhpzlkIgiLCJBY2NvdW50UGF5QW1vdW50IjoiMCIsIkdlbmRlciI6IueUtyIsIk93blBheUFtb3VudCI6IjE1LjAwIiwiU2VsZnBheW1lbnRBbW91bnQiOiIwIiwiTWVkaWNhbEluc3VyYW5jZUlEIjoiMTA0MzgxOTkxMDAxIiwiT3JnVHlwZSI6Iue7vOWQiOWMu-mZoiIsIlBhdGllbnROdW1iZXIiOiIxMDAwMTAwMjAxIiwiU2VsZnBheW1lbnRDb3N0IjoiMCJ9LCJQYXllclBhcnR5TmFtZSI6IumprOmcsiIsIlJlcENyZWF0ZXIiOiLmnY7lm5siLCJJdGVtcyI6W3siSXRlbUNvZGUiOiI5OTQwMzAxMDIwIiwiSXRlbVJlbWFyayI6W10sIkl0ZW1RdWFudGl0eSI6IjEiLCJBbW91bnQiOiIxMC4wMCIsIkl0ZW1OYW1lIjoi5qOA5p-l6LS5IiwiSXRlbVN0ZCI6IjEwLjAwIiwiSXRlbVVuaXQiOltdLCJBdXhJdGVtIjpbeyJBdXhJdGVtUXVhbnRpdHkiOiIxIiwiQXV4SXRlbUFtb3VudCI6IjEwLjAwMDAiLCJBdXhJdGVtU3RkIjoiMTAuMDAwMCIsIkF1eEl0ZW1SZWxhdGVkQ29kZSI6Ijk5NDAzMDEwMjAiLCJBdXhJdGVtVW5pdCI6IuS6uuasoSIsIkF1eEl0ZW1SZW1hcmsiOiLml6Doh6rku5giLCJBdXhJdGVtUmVsYXRlZE5hbWUiOiLmo4Dmn6XotLkiLCJBdXhJdGVtTmFtZSI6IuinkuiGnOabsueOh-ajgOafpSJ9XX0seyJJdGVtQ29kZSI6Ijk5NDAzMDEwNzAiLCJJdGVtUmVtYXJrIjpbXSwiSXRlbVF1YW50aXR5IjoiMSIsIkFtb3VudCI6IjUuMDAiLCJJdGVtTmFtZSI6Iuilv-iNr-i0uSIsIkl0ZW1TdGQiOiI1LjAwIiwiSXRlbVVuaXQiOltdLCJBdXhJdGVtIjpbeyJBdXhJdGVtUXVhbnRpdHkiOiIxIiwiQXV4SXRlbUFtb3VudCI6IjUuMDAwMCIsIkF1eEl0ZW1TdGQiOiI1LjAwMDAiLCJBdXhJdGVtUmVsYXRlZENvZGUiOiI5OTQwMzAxMDcwIiwiQXV4SXRlbVVuaXQiOiLmlK8iLCJBdXhJdGVtUmVtYXJrIjoi5peg6Ieq5LuYIiwiQXV4SXRlbVJlbGF0ZWROYW1lIjoi6KW_6I2v6LS5IiwiQXV4SXRlbU5hbWUiOiLlpI3mlrnmiZjlkKHljaHog7rmu7TnnLzmtrIifV19XSwiVG90YWxBbW91bnQiOiIxNS4wMCIsIlBheWVyUGFydHlDb2RlIjpbXX0
base64编码结果:
eyJUeXBlIjoxLCJQYXllclBhcnR5VHlwZSI6IjEiLCJSZWdpb25Db2RlIjoiNDEwMDAwIiwiU2VyaWFsTnVtYmVyIjoiMDAwMDAwNzUxOSIsIkl2Y0FnY0NvZGUiOiI1MDY0MDIiLCJNYWluRXh0Ijp7Ik90aGVyUGF5QW1vdW50IjoiMCIsIk1lZGljYWxEYXRlIjoiMjAxOTAxMTciLCJGdW5kUGF5QW1vdW50IjoiMCIsIk1lZGljYWxUeXBlIjoi6Zeo6K+KIiwiTWVkaWNhbEluc3VyYW5jZVR5cGUiOiLmlrDlhpzlkIgiLCJBY2NvdW50UGF5QW1vdW50IjoiMCIsIkdlbmRlciI6IueUtyIsIk93blBheUFtb3VudCI6IjE1LjAwIiwiU2VsZnBheW1lbnRBbW91bnQiOiIwIiwiTWVkaWNhbEluc3VyYW5jZUlEIjoiMTA0MzgxOTkxMDAxIiwiT3JnVHlwZSI6Iue7vOWQiOWMu+mZoiIsIlBhdGllbnROdW1iZXIiOiIxMDAwMTAwMjAxIiwiU2VsZnBheW1lbnRDb3N0IjoiMCJ9LCJQYXllclBhcnR5TmFtZSI6IumprOmcsiIsIlJlcENyZWF0ZXIiOiLmnY7lm5siLCJJdGVtcyI6W3siSXRlbUNvZGUiOiI5OTQwMzAxMDIwIiwiSXRlbVJlbWFyayI6W10sIkl0ZW1RdWFudGl0eSI6IjEiLCJBbW91bnQiOiIxMC4wMCIsIkl0ZW1OYW1lIjoi5qOA5p+l6LS5IiwiSXRlbVN0ZCI6IjEwLjAwIiwiSXRlbVVuaXQiOltdLCJBdXhJdGVtIjpbeyJBdXhJdGVtUXVhbnRpdHkiOiIxIiwiQXV4SXRlbUFtb3VudCI6IjEwLjAwMDAiLCJBdXhJdGVtU3RkIjoiMTAuMDAwMCIsIkF1eEl0ZW1SZWxhdGVkQ29kZSI6Ijk5NDAzMDEwMjAiLCJBdXhJdGVtVW5pdCI6IuS6uuasoSIsIkF1eEl0ZW1SZW1hcmsiOiLml6Doh6rku5giLCJBdXhJdGVtUmVsYXRlZE5hbWUiOiLmo4Dmn6XotLkiLCJBdXhJdGVtTmFtZSI6IuinkuiGnOabsueOh+ajgOafpSJ9XX0seyJJdGVtQ29kZSI6Ijk5NDAzMDEwNzAiLCJJdGVtUmVtYXJrIjpbXSwiSXRlbVF1YW50aXR5IjoiMSIsIkFtb3VudCI6IjUuMDAiLCJJdGVtTmFtZSI6Iuilv+iNr+i0uSIsIkl0ZW1TdGQiOiI1LjAwIiwiSXRlbVVuaXQiOltdLCJBdXhJdGVtIjpbeyJBdXhJdGVtUXVhbnRpdHkiOiIxIiwiQXV4SXRlbUFtb3VudCI6IjUuMDAwMCIsIkF1eEl0ZW1TdGQiOiI1LjAwMDAiLCJBdXhJdGVtUmVsYXRlZENvZGUiOiI5OTQwMzAxMDcwIiwiQXV4SXRlbVVuaXQiOiLmlK8iLCJBdXhJdGVtUmVtYXJrIjoi5peg6Ieq5LuYIiwiQXV4SXRlbVJlbGF0ZWROYW1lIjoi6KW/6I2v6LS5IiwiQXV4SXRlbU5hbWUiOiLlpI3mlrnmiZjlkKHljaHog7rmu7TnnLzmtrIifV19XSwiVG90YWxBbW91bnQiOiIxNS4wMCIsIlBheWVyUGFydHlDb2RlIjpbXX0=
总的来说,二者区别有:
base64,编码可能会生成+,/,=,三种可能同时存在,也可能都不存在;
urlsafe,编码可能会生成-,最多有且只有这一种符号。
以后,谁再跟你谈标准的base64格式,你就可以锤他啦。
在上面介绍的5种方式中,方式三、方式四都支持base64URLSafe()方法。
2022年9月22日18:14:26
Base64加密补位规则
所谓Base64,就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。
转换方式可以分为四步:
第一步,将每三个字节作为一组,一共是24个二进制位。
第二步,将这24个二进制位分为四组,每个组有6个二进制位。
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。
第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。
Base64将三个字节转化成四个字节,因此Base64编码后的文本,会比原文本大出三分之一左右。
此时如果字节数不足三,则这样处理:
a)二个字节的情况:将这二个字节的一共16个二进制位,按照上面的规则,转成三组,最后一组除了前面加两个0以外,后面也要加两个0。这样得到一个三位的Base64编码,再在末尾补上一个"="号。
比如,“Ma"这个字符串是两个字节,可以转化成三组00010011、00010110、00010000以后,对应Base64值分别为T、W、E,再补上一个”=“号,因此"Ma"的Base64编码就是TWE=。
b)一个字节的情况:将这一个字节的8个二进制位,按照上面的规则转成二组,最后一组除了前面加二个0以外,后面再加4个0。这样得到一个二位的Base64编码,再在末尾补上两个”="号。
比如,“M"这个字母是一个字节,可以转化为二组00010011、00010000,对应的Base64值分别为T、Q,再补上二个”="号,因此"M"的Base64编码就是TQ==。
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
相关推荐:
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/9358776.html