首页 资讯 社群 我的社区 搜索

什么是base64?附带对象序列化和Resource文件读写方法

高大上
2019-04-25 11:36:28
@Test
	public void testBase64Img() throws IOException {
		File file = ResourceUtils.getFile("classpath:hxlog.png");//ResourceUtils 可以直接读取Resource下的文件,springboot默认带这个工具类
		byte[] bytes = new byte[5000];
		FileInputStream fileInputStream = new FileInputStream(file);
		fileInputStream.read(bytes);
		final Base64.Encoder encoder = Base64.getEncoder();
		System.out.println(  encoder.encodeToString(bytes) );//将图片base64后的字符串交给html还是能解析为图片
		//<img src="data:image/gif;base64,放入base64的编码字符串" >
	}
	@Test
	public void testBase64() throws IOException, ClassNotFoundException {
		final Base64.Decoder decoder = Base64.getDecoder();//解码
		final Base64.Encoder encoder = Base64.getEncoder();//编码
		User user = new User("hechongyang",27);
		ByteArrayOutputStream byt=new ByteArrayOutputStream();
		ObjectOutputStream obj=new ObjectOutputStream(byt);
		obj.writeObject(user);
		byte[] bytes=byt.toByteArray();
		final String encodedText = encoder.encodeToString(bytes);
		System.out.println(encodedText);
		/*ByteArrayInputStream byteInt=new ByteArrayInputStream(bytes);//对象序列化位字符串
		ObjectInputStream objInt=new ObjectInputStream(byteInt);
		User stu2=new User();
		stu2=(User)objInt.readObject();
		System.out.println(stu2);*/
/*
		final String text = "我叫何重阳=27";
		final byte[] textByte = text.getBytes("UTF-8");
//编码
		final String encodedText = encoder.encodeToString(textByte);
		System.out.println(encodedText);//5oiR5Y+r5L2V6YeN6ZizPTI3
		System.out.println(new String(decoder.decode(encodedText), "UTF-8"));*/
	}

 

Base64的由来:
了解编码前我们要先明确一点:CPU能执行的只是二进制编码,所谓的10进制、16进制是为了减少传输量搞出来的,最终都会转换为二进制给CPU执行。
而bsae64就是将你的二进制数据转换为一种类似ascii码的格式。为什么不直接用二进制字符串呢?因为太长了。为什么不直接用ascii码呢?因为
ascii能表示的东西太少了。为什么要转换为类似asscii的格式呢?因为asscii是美国人按自己习惯设计的,使用最广泛。为什么叫base64呢?因为
一个bit占用8个二进制位,算上必要的补位等情况,64位最节省空间,所以叫base64。为什么64位最节省空间?不知道,先辈们说是就是,我懒得计算
ASCII码最早起源于美国,一共128个(0-127),也就是java中的char。他们分别表示了128个特殊符号。去掉控制符和保留字符,
ASCII码实际能用的只有95个,他能表示美国人早期生活中的全部文字和符号,但是要表示其他国家的符号位置就不够用了。因此扩展出了各种编码,
例如包含最广的Unicode,被定为互联网标准的UTF-8等等。单是不管怎么发展,ASCII作为最早期的元老,它已经被所有设备沿用至今。可能有设备不支持
Unicode或者UTF-8,但是已经会认识ASCII。在早期计算机中,所有东西的显示都是都以ASCII传输,后将0-127转换为bit,一个bit占8位,高位补零。
而base64的处理方式是将原本8个bit的内容,用6个bit来表示,如果装不下,就再申请6个bit,高位补零。这种方式牺牲了更多的传送资源,但是能表示更多的内容

用户评论