DebugEN
科技森
专注于Java开发~每天都会更新文章~
  1. 首页
  2. Java
  3. 正文

[原创] 关于Java的Base64编码

2021年02月05日 1511点热度 0人点赞 0条评论 作者: kejisen

前言

本文将介绍使用原生Java语言以及第三方库来实现Base64编码的各种方式。

使用原生Java(Java8及以上版本)

从Java8开始,java标准库中新增了 java.util.Base64 这个Base64的工具类,使用方式如下:

byte[] encodeResultBytes = Base64.getEncoder().encode("你好,debug.cn".getBytes(StandardCharsets.UTF_8));
System.out.println(new String(encodeResultBytes, StandardCharsets.UTF_8))

你没有看错,base64编码其实和md5输出的是一样的,都是byte array。
你可以直接将这个byte array传入String构造方法中,可以输出为字符串:

5L2g5aW977yMZGVidWcuY24=

其实还可以使用下面的方式直接将其转换为字符串:

String encodeResult = Base64.getEncoder().encodeToString("你好,debug.cn".getBytes(StandardCharsets.UTF_8));

使用commons-codec库

你可以使用commons-codec这个库的Base64工具类来生成base64:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.14</version>
</dependency>

如下所示:

String s = "你好,debug.cn";
String encodeResult = Base64.encodeBase64String(s.getBytes(StandardCharsets.UTF_8));
System.out.println(encodeResult);

你可能注意到了这个工具类还有一个encodeBase64Chunked方法,我们更换一下:

        String s = "你好,debug.cn";
        String encodeResult = new String(Base64.encodeBase64Chunked(s.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
        System.out.println(encodeResult);

可以看到输出和刚刚并没有什么区别,我们修改待编码的字符串,改的长一点:

        String s = "你好,debug.cn1234567890123456789012345678901234567890cn1234567890123456789012345678901234567890cn1234567890123456789012345678901234567890cn1234567890123456789012345678901234567890cn1234567890123456789012345678901234567890";
        String encodeResult = new String(Base64.encodeBase64Chunked(s.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
        System.out.println(encodeResult);

会看到如下的输出:

5L2g5aW977yMZGVidWcuY24xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw
Y24xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwY24xMjM0NTY3ODkwMTIz
NDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwY24xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4
OTAxMjM0NTY3ODkwY24xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw

居然生成了多行的字符串,这是为啥呢,我们谷歌一下,得到如下的解释:
base64的规范有两种,分别是RFC 4648 和 RFC 2045,其中

RFC 2045规定:
编码后的每行长度不能超过76个字符,且行与行之间使用\r\n来分隔(字符串末尾没有换行)

RFC 4648规定:
编码后不能添加任何换行符

也就是说有换行符是老的规范,对于Java8的Base64类来说,不支持将其编码为带换行符的字符串,但可以解码贷后换行符的字符串。

详情可以查看Javadoc中关于Base64的描述:https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html

标签: base64 java
最后更新:2021年03月03日

kejisen

保持饥渴的专注,追求最佳的品质

点赞
< 上一篇
下一篇 >

文章评论

取消回复
最新 热点 随机
最新 热点 随机
【原创】记录一次失败的折腾——使用jkeymaster实现的按键监听 【原创】这些年我用过的IDEA插件 【原创】在windows上使用VNC远程连接linux桌面 我在RxJava使用线程池时遇到的问题 [原创文章] Swagger生成pdf格式的接口文档 [个人翻译]Java HTTP工具类的客户端证书认证 [原创] 如何从 Git 的提交历史记录中删除大文件 [翻译] 创建一个只读的Repository接口(Spring Data) [翻译] 反射的用法——用Java调用私有方法 Java 虚拟机最多可以支持多少个线程? 排查Hibernate的慢查询日志–这是查找慢查询的最简单方法 [翻译] 使用apache poi在excel文件中插入一行数据 [翻译] 在Spring 中@EntityScan与@ComponentScan注解有什么区别 [原创] 从QQ音乐网页版扒歌词的补充说明 [原创] 介绍java maven项目的多种打包方式 原创——在Java中生成随机数 将G1垃圾回收的内存使用量减少20%(翻译) [原创] java8 lambda表达式的toMap造成的空指针异常 [原创] 在Spring Boot中使用CommandLineRunner来在启动时执行代码 [转载] Kafka 节点重启失败导致数据丢失的分析排查与解决之道
[原创] 如何使用okhttp发起application/json类型的请求 排查Hibernate的慢查询日志–这是查找慢查询的最简单方法 [原创] 在ubuntu18.04上安装chromedriver Spring Boot的@RequestMapping注解中加斜杠与不加斜杠的区别 将G1垃圾回收的内存使用量减少20%(翻译) [个人翻译]Java HTTP工具类的客户端证书认证 【原创】在windows上使用VNC远程连接linux桌面 [原创] 如何使用java(javamail)发送带附件的邮件 中通Elasticsearch集群运维实践(二)--监控告警 Java 虚拟机最多可以支持多少个线程? 使用Spring RestTemplate压缩请求 Linux截图软件推荐-flameshot 从QQ音乐获取并解析音乐的歌词 [原创] spring-boot返回json或者xml格式的数据 [原创] java8 lambda表达式的toMap造成的空指针异常 [转载] Kafka 节点重启失败导致数据丢失的分析排查与解决之道 [原创] 如何从 Git 的提交历史记录中删除大文件 Spring Boot项目修改Tomcat端口号 [原创] 在Spring Boot中使用CommandLineRunner来在启动时执行代码 [原创文章] Swagger生成pdf格式的接口文档
标签聚合
linux elasticsearch json java springboot spring maven qq音乐 base64 歌词

COPYRIGHT © 2020 Kejisen. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS