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