1. 简述:
Base64是一种用64个字符表示任意二进制数据的方法。它是一种编码,而非加密
A-Z a-z 0-9 + / =
2. 改编
- 在url 传输使用的码表中, + / 被 - _ 代替。 因为后端接收到 + ,会成为 空字符串。
类似Hexbin编码,通过修改码表,可以生成变种base64
3. Base64的应用
RSA密钥、加密后的密文、图片等数据中,会有一些不可见字符。直接转成文本传输的话,会有乱码、数据错误、数据丢失等情况出现,就可以使用Base64编码
4. Base64的代码实现和码表
java
public static void main(String[] args) { String name = "横笛"; byte[] bytes = name.getBytes(StandardCharsets.UTF_8); String encode = Base64.getEncoder().encodeToString(bytes); byte[] encode1 = Base64.getEncoder().encode(bytes); System.out.println(encode); System.out.println(new String(encode1)); }
Android
String name1 = "横笛"; // okio.Base64 encode ByteString byteString1 = ByteString.of(name1.getBytes(StandardCharsets.UTF_8)); String encode1 = byteString1.base64(); System.out.println("okhttp3:" + encode1); // java.util.Base64 // 这里是因为对Android版本有要求 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { String string2 = Base64.getEncoder().encodeToString(name1.getBytes(StandardCharsets.UTF_8)); byte[] string3 = Base64.getEncoder().encode(name1.getBytes(StandardCharsets.UTF_8)); System.out.println("java- utils:"+string2); System.out.println("java- utils:"+ Arrays.toString(string3)); } // android.util.Base64 String string4 = android.util.Base64.encodeToString(name1.getBytes(StandardCharsets.UTF_8),0); byte[] string5 = android.util.Base64.encode(name1.getBytes(StandardCharsets.UTF_8),0); System.out.println("android.util.Base64:"+string4); System.out.println("android.util.Base64:"+new String(string5));
5. Base64编码细节
每个Base64字符代表原数据中的6bit
Base64编码后的字符数,是4的倍数
编码的字节数是3的倍数时,不需要填充
6. Base64编码的特点
a) Base64编码是编码,不是压缩,编码后只会增加字节数
b) 算法可逆, 解码很方便, 不用于私密信息通信
c) 标准的Base64每行为76个字符,行末添加换行符
d) 加密后的字符串只有65种字符, 不可打印字符也可传输
e) 在Java层可以通过hook对应方法名来快速定位关键代码
f) 在so层可以通过输入输出的数据和码表来确定算法
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。