URL编码是对字符进行编码,表示成%xx的格式,而Base64编码是对二进制数据进行编码,表示成文本格式
一、URL编码
//URLEncoder类:进行编码操作
String str="雅马哈NMAX155";
//将关键字先按照UTF-8的编码集获取编码值
//然后将编码值,进行URL编码格式的处理%xx
String result;
try {
result = URLEncoder.encode(str, "UTF-8");
System.out.println(result);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//URLDecoder类:进行解码操作
String str="%E9%9B%85%E9%A9%AC%E5%93%88NMAX155";
String result;
try {
result = URLDecoder.decode(str, "UTF-8");
System.out.println(result);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
二、Base64编码
//Base64编码:将二进制数据(字节数据byte[]),编码成字符串文本结果
//读取图片,获取所有的字节数据
byte[] imageBytes=Files.readAllBytes(Paths.get("C:\\JavaSE-source01\\渭城朝雨.jpg"));
//进行Base64编码
String imageBase64=Base64.getEncoder().encodeToString(imageBytes);
//将编码结果写入文本文件
Files.write(Paths.get("C:\\JavaSE-source01\\图片.txt"), Arrays.asList(imageBase64));
//Base64解码
try {
//读取到图片的Base64编码结果
List<String> lines= Files.readAllLines(Paths.get("C:\\JavaSE-source01\\img.txt"));
String imageBase64=lines.get(0);
//进行Base64解码处理
byte[] imageBytes=Base64.getDecoder().decode(imageBase64);
//将解码后的字节数组,重新写入一个新的图片文件
Files.write(Paths.get("C:\\JavaSE-source01\\渭城朝雨.jpg"), imageBytes);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
因为标准的Base64编码会出现+、/和=,所以不适合把Base64编码后的字符串放到URL中。一种针对URL的Base64编码可以在URL中使用的Base64编码,它仅仅是把+变成-,/变成_:
byte[] input=new byte[] {0x01,0x02,0x7f,0x00};
//进行Base64编码
String res2=Base64.getUrlEncoder().encodeToString(input);
System.out.println(res2);
//进行Base64解码
byte[] b2=Base64.getUrlDecoder().decode(res2);
System.out.println(Arrays.toString(b2));
三、哈希算法
//消息摘要计算(图片)
//根据算法名称(例如MD5),创建MessageDigest 消息摘要对象
MessageDigest messageDigest=MessageDigest.getInstance("MD5");
//输入数据
//字符串
// String str="一寸光阴一寸金";
// messageDigest.update(str.getBytes());
//文件
messageDigest.update(Files.readAllBytes(Paths.get("C:\\JavaSE-source01\\渭城朝雨.jpg")));
//消息摘要计算(哈希运算)
byte[] digetsResultBytes=messageDigest.digest();
System.out.println("摘要结果长度:"+digetsResultBytes.length);
System.out.println("摘要结果内容:"+Arrays.toString(digetsResultBytes));
System.out.println("摘要结果编码:"+Base64.getEncoder().encodeToString(digetsResultBytes));
//消息摘要计算(zip压缩文件)
//进行哈希运算,获取消息摘要结果
MessageDigest messageDigest=MessageDigest.getInstance("SHA512");
messageDigest.update(Files.readAllBytes(Paths.get("C:\\Huanjing\\PyCharm Community Edition 2023.3.4.zip")));
byte[] digestResultBytes=messageDigest.digest();
//5a0fe8b95c371bbd2f2f0e0ba4cde52646d1d9939a94a966204579746c71f387200a8becb47b7237a659db36e7dd156abba5054cc4ca2ef47193fae004f0254b
//进行十六进制字符编码转换
//每个字节按2位十六进制字符进行编码
StringBuilder digestReault=new StringBuilder();
for(byte b:digestResultBytes) {
digestReault.append(String.format("%02x", b));
}
System.out.println(digestReault);