编码定义:
最简单的编码是直接给每个字符指定一个若干字节表示的整数,复杂一点的编码就需要根据一个已有的编码推算出来
URL编码
URL编码是浏览器发送数据给服务器时使用的编码,它通常附加在URL的参数部分,例如:
https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87
代码实现:
public class url {
public static void main(String[] args) {
try {
String KeyWord = "美好的一天";
String index = URLEncoder.encode(KeyWord, "utf-8");//编码
String outdex = URLDecoder.decode(index,"utf-8");//解码
System.out.println(index);
System.out.println(outdex);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
特别注意:
URL编码是编码算法,不是加密算法。URL编码的目的是把任意文本数据编码为%前缀表示的文本,编码后的文本仅包含A-Z,a-z,0~9,“-”,“_”,“.”,“*“和”%”,便于浏览器和服务器处理。
Base64编码
URL编码是对字符进行编码,表示成%xx的形式,而Base64编码是对二进制数据进行编码,表示成文本格式。Base64编码可以把任意长度的二进制数据变为纯文本,并且纯文本内容中且只包含指定字符内容:A-Z、a-z、0-9、+、/、=。它的原理是把3字节的二进制数据按6bit一组,用4个int整数表示,然后查表,把int整数用索引对应到字符,得到编码后的字符串。
6位整数的范围总是0-63,所以,能用64个字符表示:字符A-z对应索引0-25,字符a-z对应索引26-51,字符0-9对应索引52-61,最后两个索引62、63分别表示字符"+“和”/"。
代码实现
1.对字节数组转码/解码(二进制数据)
//Base64: 将字节数组编码成字符串或将Base64字符串解码为字节数组
public class base {
public static void main(String[] args) {
//原始数组
byte[] ns = {(byte)0x65,(byte)0x87,(byte)0x78,(byte)0x45};
//基于Base64进行编码
String index = Base64.getEncoder().encodeToString(ns);//转码
System.out.println(index);
//基于Base64进行解码
byte[] array = Base64.getDecoder().decode(index);
for (byte b : array){
System.out.println(Integer.toHexString(b));
}
}
}
2.标准的Base64编码会出现+、/和=,所以不适合把Base64编码后的字符串放到URL中。一种针对URL的Base64编码可以在URL中使用的Base64编码,它仅仅是把+变成-,/变成_
//将原始字节内容处理为适合URL传递的Base64编码
public class URLbase {
public static void main(String[] args) {
byte[] ns = {(byte)0x65,(byte)0x87,(byte)0x78,(byte)0x45};
//编码
String index1 = Base64.getEncoder().encodeToString(ns);//默认Base64编码
String index2 = Base64.getUrlEncoder().encodeToString(ns);//基于URL方式进行Base64编码处理
System.out.println(index1);
System.out.println(index2);
//解码
//对比解码结果一致
System.out.println(Arrays.toString(Base64.getDecoder().decode(index1)));
System.out.println(Arrays.toString(Base64.getUrlDecoder().decode(index2)));
}
}
3.基于Base64编码传输图片
public class Imagebase {
public static void main(String[] args) throws IOException {
//读取图片原始信息
byte[] image1 = Files.readAllBytes(Paths.get("d:\\text\\java.png"));
//1.按照Base64编码,并写入文件
String base11 = Base64.getEncoder().encodeToString(image1);
Files.write(Paths.get("d:\\text\\java.txt"),base11.getBytes());
//2.从文本文件读取Base64编码内容,还原为字符串
byte[] image = Files.readAllBytes(Paths.get("d:\\text\\java.txt"));
String base64Image = new String(image);
//2.对Base64编码的字符串进行解码,保存为图片
byte[] base = Base64.getDecoder().decode(base64Image);
Files.write(Paths.get("d:\\text\\1.png"),base);
}
}
小结
1.Base64编码的目的是把二进制数据变成文本格式,这样在很多文本中就可以处理二进制数据。例如,电子邮件协议就是文本协议,如果要在电子邮件中添加一个二进制文件,就可以用Base64编码,然后以文本的形式传送
2.Base64编码的缺点是传输效率会降低,因为它把原始数据的长度增加了1/3。如果把Base64的64个字符编码表换成32个、48个或者58个,就可以使用Base32编码,Base48编码和Base58编码。字符越少,编码的效率就会越低
3.URL编码和Base64编码都是编码算法,它们不是加密算法
4.URL编码的目的是把任意文本数据编码为%前缀表示的文本,便于浏览器和服务器处理
向上攀爬的痛苦,终会在登顶时烟消云散
——ZQY