编码算法、哈希算法

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);

 

 

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值