Java8————Base64

Base64?

Base64是一种用64个字符来表示任意二进制数据的方式。

对于二进制文件如图片、exe、音频、视频等,包含很多无法显示和打印的字符,如果希望能够通过记事本这样的文本处理软件处理二进制数据,就需要一个二进制转字符串的转换方法。

Base64是一种非常常用的二进制编解码方案。编解码方法简单且公开,并不具有加密解密的效用。只作为一种二进制数据的文本存储格式。

Base64的64个字符

64个字符,每个字符代表一种编码,共64种编码。

A-Z , a-z , 0-9 , + , /

Base64的编码原理

对于长短不一的二进制数据,Base64将其从头部开始以三个字节为一组(24 bit),一组划分成4等块(每块6 bit),根据乘法原理,这6bit的二进制共有2^6 = 64种编码方式,正好对应64个字符。

换句话说,Base64将二进制数据从头开始,每6 bit 用一个字符(64个基本字符中的一个)代替表示,一直到二进制数据末尾。

不论是Unicode字符集(Java默认,一个英文字符2个字节),还是UTF-8(一个英文字符1个字节),亦或是ASCII(一个英文字符一个字节),二进制数据通过Base64进一步转化后长度一定是增加的。虽然增加了网络传输量,但是好处是不会存在因为无法显示或打印的字符而造成数据的丢失,保证了数据在传输中的完整性。

Base64的补位

Base64要求转化后的结果必须能被 4 整除,也就是说二进制数据字节数必须是3的倍数,如果末尾多出一个或两个字节,Base64会额外补充一个“=” 或两个“=”,表示补了多少个字节,在解码的时候会自动去掉。

Java8的Base64

在Java8之前一直是缺少Base64编码解码的API,我们通常会使用第三方工具。

Java8 为开发者提供了 java.util.Base64 的工具类,并提供一套静态方法获取三种Base64编解码器:

1)Basic编码

2)URL编码

3)MIME编码

Basic编码

Basic编码是标准的Base64编码,用于处理常规的需求:输出的内容不添加换行符,而且输出的内容由64个基本字符组成。

try {String encoded = Base64.getEncoder().encodeToString("Will Smith = 威尔·史密斯".getBytes("UTF-8"));System.out.println(encoded);String decoded = new String(Base64.getDecoder().decode(encoded));System.out.println(decoded);
} catch (UnsupportedEncodingException e) {e.printStackTrace();
}

 输出:

URL编码

由于标准的Basic编码可能会出现+ 和 / ,在URL中就不能直接作为参数,所以又有一种“url safe” 的Base64编码,其实就是吧字符 + 和 / 分别变成 - 和_

 MIME编码

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用对应的应用程序来打开的方式类型。

它是一种互联网标准,扩展了电子邮件标准,使其可以支持:非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分组成的消息体;包含非ASCII字符的头信息等。

举个栗子:右键中有一个Word附件(二进制文件),点击预览,浏览器会直接打开Office。可以理解为MIME设定了这种对应关系。

MIME编码器会使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“\r\n”符结束。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大众点评后端项目解析

restful Api是一种设计风格: 启动前端项目:在前端项目根目录 npm install:加载依赖包 npm run mock:提供模拟数据的接口,前端脱离于后台;start /b npm run mock(于后台运行) npm…

Java中类及方法的加载顺序

代码展示 请运行下面代码,查看运行结果,并带着问题,尝试第二次debug程序。 class A {private static int numA;private int numA2;static {System.out.println("A的静态字段 : " numA);System.out.println("A的静态代码块…

新手入门教程-------Spring Boot中集成RabbitMQ

AMQP:是Advanced Message Queuing Protocol的简称,高级消息队列协议,是一个面向消息中间件的开放式标准应用层协议。 定义了以下特性: 消息方向消息队列消息路由(包括:点到点和发布-订阅模式)可…

Java 多线程 —— ReentrantLock 与 Condition

引言 ReentrantLock 是 JUC 下的一个功能强劲的锁工具,支持公平锁、非公平锁,以及多等待队列的 Condition 。 也常常被称为“手动锁”。本篇博客主要分析它的使用方法以及 Condition 实现的一个生产者消费者模式。 一、可替代 synchronized 的手动锁 …

Rabbitmq+Springboot设计秒杀应用

秒杀业务的核心是库存处理,用户购买成功后会进行减库存操作,并记录购买明细。当秒杀开始时,大量用户同时发起请求,这是一个并行操作,多条更新库存数量的SQL语句会同时竞争秒杀商品所处数据库表里的那行数据&#xff0c…

Java8————Stream API

引言 Java8 加入了java.util.stream包,这个包中的相关API将极大的增强容器对象对元素的操作能力。 它专注于对集合对象进行各种便利、高效的聚合操作,或大批量数据处理。 Stream API借助于同样新出现的Lambda表达式,极大的提高了编程效率和…

MySQL数据库知识点总结

数据库: 数据库索引的好处:索引是对数据库表中的一个或多个列的值进行排序的结构,这样检索或者查询某条记录的时候就不在是顺序查找,而是使用特定的查找方式进行查找,如通过二分查找或者是hash值来查找,提高…

Java8 函数式对齐约定————Eclipse自定义代码风格

引言 Java8 的函数式代码风格在Stream的使用上尤为突出。尽管我们可以通过连续调用函数完成一系列操作,但是其可读性并不能保证,还需要有与之相辅的Code Style。例如,请尝试阅读下面两段完全相同的代码: 未遵守约定格式&#xf…

Java核心篇之JVM--day3

Java核心篇之JVM--day3 Java JVM详解--通俗易懂教程 JVM:Java虚拟机的简称。 谈到JVM,通常会聊到三个问题: 1. 什么时候触发Java GC? 2. 对什么东西进行Java GC? 3. 如何进行Java GC? 首先解决第…

使用springboot来实现WebLog

使用websocket技术实时输出系统日志到浏览器端,实现WebLog boot-websocket-log: spring boot系统中使用websocket技术实时输出系统日志到浏览器端,因为是实时输出,所有第一时间就想到了使用webSocket,而且在spring boot中&#…

设计模式---观察者模式介绍与理解

设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,…

CRS-4995: The command ‘start resource’ is invalid in crsctl.

ntp时间调整后,节点1,advm 和acfs offline 处理办法: /u01/app/12.2.0.1/grid/bin/crsctl stop crs /u01/app/12.2.0.1/grid/bin/crsctl start crs 曾经尝试如下命令不起作用 /u01/app/12.2.0.1/grid/bin/acfsload start /u01/app/12.2…

抽象工厂模式升级版————泛型化实现

引言 今天回看之前总结的抽象工厂模式的实现《Java常用设计模式————抽象工厂模式》,聚焦于抽象工厂模式的缺点,试着改进了一下。 回顾一下抽象工厂模式的缺点: 在添加新的产品类型时,难以扩展抽象工厂来生产新种类的产品。…

发生在“注解”@的那些事儿

注解: 自定义注解: 注解和类,接口一样,属于一种数据类型 注解可以放在类,方法,属性上面 注解可以有属性,也可以没有属性 注解有作用范围 ( 源码期间(String&#…

Java常用设计模式————建造者模式

引言 建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象。这种类型的设计模式属于建造型模式,它提供了一种创建对象的最佳方式。 一个Builder会一步步构建最终的对象。该Builder类是独立于其他对象的。 实现概要 …

使用动态代理解决网站字符集编码问题:(之前通过拦截器)

使用动态代理解决网站字符集编码问题:(之前通过拦截器) 设计模式: 在软件开发的过程中,遇到相识的问题,将问题的解决方式抽象为模型(套路) 单例模式(静态代码只会执行一…

设计模式---简单工厂设计模式

先定义一个抽象类Animal: 定义两个动物类继承这个类: 定义一个专门生产动物的工程类: 最后定义一个测试类: 按照这个动物工厂类,你会发现,如果动物一多的话,就需要写很多重复的方法,…

Java 多线程 —— ThreadLocal

一、引言 ThreadLocal是Java帮助实现线程封闭性的典型手段。 作用:提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量的传递复杂度。同时也用来维护线程中的变量不被其他线程干扰。 …

设计模式---适配器设计模式

设计模式---适配器设计模式 什么事适配器: 1. 在使用监听的时候,需要定义一个类事件监听器接口 2. 通常接口中有多个方法,而程序中不一定所有的方法都用到,但又必须重写,很繁琐 3. 适配器简化了这些操作&#xff0c…

Java并发编程实战————售票问题

引言 现有一个需求如下: 有10000张火车票,每张票都有一个编号,同时有10个窗口对外售票,如何确保车票的正常售卖? 程序一:使用List 问题的解决办法都是从我们最最熟悉的角度思考。程序一,我们…