1.起因
在2021年09月10日开发功能时,对服务方返回的base64字符串进行解码,结果总是报错;
后台我在Idea控制台打印base64字符串,我发现字符串竟然换行了,然后我又把控制台打印的base64字符串复制到Idea中是,每行结尾都是\n字符,后来我上网搜了一下,发现这个换行符不应该存在于base64中;
鉴于自己知识储备不足,导致解决该问题耗费了时间,所以,特此记录一下;
2.base64组成
①大写A-Z共26个字母;
②小写a-z共26个字母;
③0-9共10个数字;
④外加2个特殊字符:“+”、“/”;
⑤等号“=”用来作为后缀用途;
加起来共64个字符;
3.base64用处
把二进制变成文本字符串;
4.base64变种
由于base64中包含【+】、【/】字符,而这2个字符在不同场景下会产生歧义,因此,针对不同的应用场景又分别研制了Base64的各种变种,为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本;(即去掉上面这2个字符)
4.1.与URL相关的变种
当base64用于URL编码时,鉴于base64里面自带的【+】、【/】,URL编码器会对这2个字符变成“%XX”形式,而在SQL中“%”是作为模糊匹配的,因此,需要在入库之前需要对“%XX”进行转换;
为了解决这种场景下的base64应用问题,而出现了针对URL编码器的base64变种:
①在末尾填充'='号;
②将标准Base64中的“+”和“/”分别改成了“-”和“_”,避免在URL编解码和数据库存储时所要作的转换;
4.2.与正则表达式相关的变种
base64里面自带的【+】、【/】在正则表达式中有特殊的含义,因此,需要有一种针对正则表达式的变种:
①将Base64的“+”和“/”改成了“!”和“-”;
4.3.其他变种
还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name);
5.base64整体逻辑
每3个8字节转换为4个6字节(3*8 = 4*6 = 24个字节);
6.规则
①把3个8字节变成4个6字节;
②每76个字符加一个换行符:\r或者\n;
③最后的结束符也要处理;
7.当字节数不被3整除时
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉;
8.总结
①注意应该出现的64个字符,不再这里面的字符,就是base64自动添加的换行符,这些换行符有的时候需要开发者自己去掉;
②注意自己使用的是哪个变种的base64;