前言
base64 编码会将字符串编码得到一个含有 a-za-z0-9+/ 的字符串。
base64 编码和解码网上有些地方称为 base64 加密和解密,这是不准确的。base64 是不能用来加密和解密的,它只是一种编码解码方式,不能用于加密和解密,如果你想加密和解密可以选择如 aes、rsa 等加密算法。
标准的 base64 并不适合直接放在 url 里传输,因为url编码器会把标准 base64 中的“/”和“+”字符变为形如 “%xx” 的形式,而这些 “%” 号在存入数据库时还需要再进行转换,因为 ansi sql 中已将“%”号用作通配符。
一、base64编码和解码
1.标准的 base64 有填充的编码与解码
在 base64 编码中,输出编码字符串的长度必须是 3 的倍数。如果不是 3 的倍数编码器会根据需要在编码结尾添加一个或两个填充字符 “=” 以满足此要求。在解码时,解码器会丢弃结尾的那些额外的填充字符进行解码。
开发中一般都使用此方法进行 base64 编码与解码,就像下面这样:
//base64编码
string str = "hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy测试,base64测试加密解密hgdjuytiytiuyuytiuyirytr";
string encodedstring = base64.getencoder().encodetostring(str.getbytes());
//输出:agvsbg8h5l2g5aw9lowwj+ayju+8gewtic/lk4jlk4jvvizkvadljrvlk6rvvj9zz2ryntyrps8qjnl5eea1i+ivle+8jgjhc2u2noa1i+ivlewkoowvhuino+wvhmhnzgp1exrpexrpdxl1exrpdxlpcnl0cg==
system.out.println(encodedstring);
//base64解码
byte[] decodedbytes = base64.getdecoder().decode(encodedstring);
string decodedstring = new string(decodedbytes);
//输出:hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy测试,base64测试加密解密hgdjuytiytiuyuytiuyirytr
system.out.println(decodedstring);
你会发现上面的标准的 base64 编码后的字符串除了大小写字母和数字还会有 +、/ 这两个符号,这不太适合用于 url 传输或作为 url 中的参数,就像前言中说的那样,如果要用于 url,可以采用 geturlencoder 和 geturldecoder 的 base64 编码:
//base64编码
string str = "hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy测试,base64测试加密解密hgdjuytiytiuyuytiuyirytr";
string encodedstring = base64.geturlencoder().encodetostring(str.getbytes());
//输出:agvsbg8h5l2g5aw9lowwj-ayju-8gewtic_lk4jlk4jvvizkvadljrvlk6rvvj9zz2ryntyrps8qjnl5eea1i-ivle-8jgjhc2u2noa1i-ivlewkoowvhuino-wvhmhnzgp1exrpexrpdxl1exrpdxlpcnl0cg==
system.out.println(encodedstring);
//base64解码
byte[] decodedbytes = base64.geturldecoder().decode(encodedstring);
string decodedstring = new string(decodedbytes);
//输出:hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy测试,base64测试加密解密hgdjuytiytiuyuytiuyirytr
system.out.println(decodedstring);
2.base64无填充的编码与解码
无填充的编码编码后的字符串结尾不会添加 “=” 字符。
//base64编码
string str = "hello!你好,小明!";
string encodedstring = base64.getencoder().withoutpadding().encodetostring(str.getbytes());
system.out.println(encodedstring); //agvsbg8h5l2g5aw9lowwj+ayju+8gq
//base64解码
byte[] decodedbytes = base64.getdecoder().decode(encodedstring);
string decodedstring = new string(decodedbytes);
system.out.println(decodedstring); //hello!你好,小明!
注意:
除了上面介绍的 base64 类进行 base64 编码和解码,jdk 的 base64decoder 类也提供了 base64 编码和解码。
但是不推荐使用 base64decoder 类进行编码和解码。
因为 base64decoder 是对mime友好的,编码后的字符串如果超过76个字符就会换行,所以 base64decoder 编码后的字符串会后 \n\r 这样的字符,在一些处理 \n\r 的代码里可能会有问题。
如果你非要使用 base64decoder 类进行编码和解码,请使用replaceall(“\r|\n”, “”) 对编码后的 \n和 \r 进行替换。
二、mime友好型base64编码和解码
mime 友好型 base64 编码和解码即编码后如果长度每大于 76 就会加入 \r\n 这样的换行控制符
//base64编码
string str = "727dced7-15c7-48c6-bb11-416ab51f98bc-2a19434a-3a64-496e-b07b-b51b0445384c-22525be7-82c7-4a72-8594-238712d4d59e";
byte[] encodedasbytes = str.getbytes();
string encodedmime = base64.getmimeencoder().encodetostring(encodedasbytes);
system.out.println("编码:"+encodedmime);
//base64解码
byte[] decodedbytes = base64.getmimedecoder().decode(encodedmime);
string decodedmime = new string(decodedbytes);
system.out.println("解码:"+decodedmime); //727dced7-15c7-48c6-bb11-416ab51f98bc-2a19434a-3a64-496e-b07b-b51b0445384c-22525be7-82c7-4a72-8594-238712d4d59e
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论