Base64对中文的编解码

fe9887c3040540abb2dac3441fecf24a.png

import java.io.*;
import java.util.Base64;

public class Base {
	public static void main(String[] args) {
		String s=new String("到对应CA的公钥了。所以,这里有个 Bug,根证书的真实性由浏览器和操作系统担保的,如那么里面的公钥可能会被别有用心的人修改,那么你整个电脑的HTTPS体系就不再可靠了。");
		byte[] a=s.getBytes();
		var bs=Base64.getEncoder();
		byte[] bou=bs.encode(a);
		for(byte k:bou) {
			System.out.print((char)k);
		}
		System.out.println();
		var ds=Base64.getDecoder();
		byte[] dou=ds.decode(bou);
		var dou1=new ByteArrayInputStream(dou);
		
			InputStreamReader dou2;
		
			try {
				dou2 = new InputStreamReader(dou1,"UTF-8");
				int k;
				String dou3="";
				k=dou2.read();
				while(k!=-1) {
					dou3=dou3+(char)k;
					k=dou2.read();
				}
				System.out.print(dou3);
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

    发现输出的乱码值为   0xff ,就是-1,改为判断循环语句,消除乱码

java byte取值-128至127   一个字节为8位,取值范围是0-255 ,ascii 取值是0-127。当我们从文件或网络读字节是用  int  a=in.read(),  读出的是每个字节的数值,计算机是用数值来运算的,int a 取值是整数范围的0-255。如果要把这个数值输出来让我们看到,可以用System.out.println(a),输出的是十进制数。但我们要认识的字符,所以就出现了ascii。它就是计算机用的数字和我们要看见的字符的转换工具。java 用System.out.println((char)a)就可以看到此字节的数字对应的字符了。

但现在问题就是  in.read()的读取范围是0-255,读取的值是存在byte[] 数组中的,而byte的范围是-128至127    那么读取大于127数存在byte[]数组中就变成负数了,用System.out.print((char)a)读出来就是乱码了。

除了文本文件不会乱码,如二进制的文件,我们要用的公钥,私钥。。。取值范围都是0-255,如果要把它打印出来,或者存起来,要么是负数,要么是乱码。这时侯Base64就派上用场了,用它编一下码再输出,或者存储就行了。

可以用System.out.print((byte)130)  -->-126   验证一下。

现在正学https 说一下我学java 的感受。最好去学习JDK,多看jdk文档,少看网络上的现成代码。网络上的代码好多都是重复的。看文档,知道怎样生成实倒,是用静态方法,还是用new ,针对实例又有什么操作方法,对象。实在看不懂了,去网上看一下代码是怎样用的,又回来看一下jdk. 基本上就理解了。学java 就是学JDK

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值