基本概念
hex也称为base16,意思是使用16个可见字符来表示一个二进制数组,编码后数据大小将翻倍,因为1个字符需要用2个可见字符来表示。
base32,意思是使用32个可见字符来表示一个二进制数组,编码后数据大小变成原来的8/5,也即5个字符用8个可见字符表示,但是最后如果不足8个字符,将用=来补充。
base64,意思是使用64个可见字符来表示一个二进制数组,编码后数据大小变成原来的4/3,也即3个字符用4个可见字符来表示。
使用场景
1 | 有很多字符是不可见的,我们需要把这些不可见字符变成可见字符。那为啥要变成可见字符?你是看着乱码舒服还是看着可见字符舒服呢?其实不仅仅舒不舒服的问题,有些时候还必须要用可见字符,例如在网络中传输数据时,不同路由器对于不可见字符的处理是不同的,因此可能出现数据错误,因此还必须使用可见字符。 |
Unicode
只是一个符号集,将世界上所有的符号都纳入其中。
只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
乱码
乱码是因为编码、解码方式不一致,因此要知道字符的编码方式,然后按照同样的方式去解码。
编码转换方法
new String("hello".getBytes("ISO-8859-1"), "UTF-8");
Demo
HEX
依赖Guava
/**
* Hex编码, 将byte[]编码为String,默认为ABCDEF为大写字母.
*/
public static String encodeHex(byte[] input) {
return BaseEncoding.base16().encode(input);
}
/**
* Hex解码, 将String解码为byte[].
*
* 字符串有异常时抛出IllegalArgumentException.
*/
public static byte[] decodeHex(CharSequence input) {
return BaseEncoding.base16().decode(input);
}
Base32
Base64
依赖Guava
/**
* Base64编码.
*/
public static String encodeBase64(byte[] input) {
return BaseEncoding.base64().encode(input);
}
/**
* Base64解码.
*
* 如果字符不合法,抛出IllegalArgumentException
*/
public static byte[] decodeBase64(CharSequence input) {
return BaseEncoding.base64().decode(input);
}
区别与联系
区别主要就是空间效率的区别,base64是具有比较高的空间效率的。当然,hex编码不区分大小写,但是base32与base64是区分的。
联系就是大家都是一种稳定的把二进制数组变成可见字符的编码方式。
base32中StdEncoding和HexEncoding所使用的字符不同,但是具体其他区别我也不是很清楚。
base64中URLEncoding一般用于编码URL