什么是Base64以及在Java中如何使用Base64编码

 更新时间:2024年12月07日 11:51:32   作者:三汘  
这篇文章主要介绍了什么是Base64以及在Java中如何使用Base64编码的相关资料,文中包括Base64编码的基本原理、应用、Java实现、URL安全编码以及在JavaScript中的使用方法,需要的朋友可以参考下

1. Base64编码介绍

Base64编码: Base是MIME的一种编码方式,MIME规范中定义了Base64编码作为一种可靠的方式,用于在文本协议中表示二进制数据。通过使用Base64编码,可以将二进制数据转换为可打印的ACSII字符即Base64编码是从二进制到字符的过程,从而保证数据在传输过程中不受损失,并且能够被各种文本协议(如SMTP、HTTP)正确处理。

Base64编码与加密算法: 严格来说,Base64的加密解密是指编码格式,而非加密算法。

Base64编码的应用: 在MIME中,当需要在文本协议中传输二进制数据(如邮件附件或图片数据)时,通常会将二进制数据先进行Base64编码,然后将编码后的数据作为文本内容(字符串形式)进行网络传输,或者进行存储

Bsae64编码的格式: Base64是一种用64个字符(0-9,a-z,A-Z,+,/)来表示二进制数据的方法,是基于64个可打印字符进行编码的。Base是一种索引编码,每6个bit位作为一个单元,对应一个字符,为了保证所输出的编码为可读字符,Base64制定了一个编码表,以便进行统一转换,编码表的大小为2^6=64,这也是Base64名称的由来。

Base64编码表:

Base64编码的原理: Base64编码要求把3个8bit的字节(3*8=24bit)转换为4个6bit的字节(4*6=24bit),之后在6bit位的前面补两个0,形成8位一个字节的形式。如果剩下的字符不足三个字节(将字符串以3个字符为一组,当最后一组不够3个字符时),则用0补齐,以达到24个bit,当填充后有6个bit位都为0时,则使用字符=进行表示,因此编码后输出的文本末尾可能会出现1或2个=

ASCII码转Base64: ASCII是8个bit为一个字节,Base64是6个bit为一个字节。

示例1,正好有3个字符时: ASCII编码you,Base64编码eW91。

示例2,只有2个字符时: ASCII编码yo,Base64编码eW8=。

示例3,只有1个字符时: ASCII编码y,Base64编码eQ==。

2. Java实现Base64编码

2.1 使用Base64进行编码

Base64类: 全类名为java.util.Base64,在JDK8及以上版本中,可以直接使用该类实现Base64编码和解码。如果JDK版本低于8,使用org.apache.commons.codec.binary.Base64。

使用Base64对文本进行编码和解码:

@Test
public void test(){
    String content = "asnhlkqwe8uj12j3";
    // 获取文本的字节信息
    byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 115, 110, 104, 108, 107, 113, 119, 101, 56, 117, 106, 49, 50, 106, 51]
    // 对文本的字节信息进行Base64编码
    byte[] encode = Base64.getEncoder().encode(bytes);//[89, 88, 78, 117, 97, 71, 120, 114, 99, 88, 100, 108, 79, 72, 86, 113, 77, 84, 74, 113, 77, 119, 61, 61]
    // 将Base64编码的字节转换成ASCII码对应的字符串
    String s1 = new String(encode, StandardCharsets.UTF_8);//YXNuaGxrcXdlOHVqMTJqMw==
    // 对文本的字节信息进行Base64编码,转换成ASCII码对应的字符串
    String s2 = Base64.getEncoder().encodeToString(bytes);//YXNuaGxrcXdlOHVqMTJqMw==

    // 对Base64编码的字符串进行解码,获取原始的文本的字节信息
    byte[] decode = Base64.getDecoder().decode(s2);//[97, 115, 110, 104, 108, 107, 113, 119, 101, 56, 117, 106, 49, 50, 106, 51]
    // 将字节信息转换成对应的文本
    String s3 = new String(decode, StandardCharsets.UTF_8);//asnhlkqwe8uj12j3
}

使用Base64对图片进行编码和解码:

@Test
public void test4() throws IOException {
    // 获取图片文件
    File file = new File("C:\\Users\\sq\\Desktop\\2024.png");
    // 获取图片文件的字节信息
    byte[] bytes = Files.readAllBytes(file.toPath());
    // 使用Base64进行编码,并转换成Base64编码表中对应字符组成的字符串
    String s = Base64.getEncoder().encodeToString(bytes);

    // 将Base64编码的字符串保存在文本文件中
    Files.writeString(new File("C:\\Users\\sq\\Desktop\\te.txt").toPath(), s);

    // 获取文本文件
    File file1 = new File("C:\\Users\\sq\\Desktop\\te.txt");
    // 获取文本文件中保存的字符串对应的字节信息,使用ASCII码表示
    byte[] bytes1 = Files.readAllBytes(file1.toPath());
    // 将ASCII码转换成对应字符串,此处s1=s
    String s1 = new String(bytes1, StandardCharsets.UTF_8);

    // 对Base64编码的字符串进行解码,获取原始的图片文件的字节信息,此处decode=bytes
    byte[] decode = Base64.getDecoder().decode(s1);
    // 创建文件,将字节信息转换成图片
    Files.write(new File("C:\\Users\\sq\\Desktop\\2024.png").toPath(),decode);
}

2.2 使用Base64Utils编码

Base64Utils: 全类名为org.springframework.util.Base64Utils,是Spring框架中的一个工具类,主要用于处理Base64编码和解码的操作,Base64Utils简化了Base64编码和解码的过程。

对文本数据进行编码和解码:

@Test
public void test2(){
    String content = "asnhlkqwe8uj12j3";
    byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 115, 110, 104, 108, 107, 113, 119, 101, 56, 117, 106, 49, 50, 106, 51]
    String s1 = Base64Utils.encodeToString(bytes);//YXNuaGxrcXdlOHVqMTJqMw==

    byte[] decode = Base64Utils.decodeFromString(s1);//[97, 115, 110, 104, 108, 107, 113, 119, 101, 56, 117, 106, 49, 50, 106, 51]
    String s2 = new String(decode, StandardCharsets.UTF_8);//asnhlkqwe8uj12j3
}

2.3 URL安全相关的Base64编码

URL不安全的Base64编码: 如果不使用URL安全的编码方式,URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式(即经过Base64编码后的字符串在通过URL参数进行网络传输时,浏览器会自动对特殊字符进行URL编码),而这些“%”在存入数据库时还需要再进行转换(URL解码),因为ANSI SQL中已将“%”号用作模糊查询like的通配符。

@Test
public void test2(){
    String content = "ab?";
    byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 98, 63]
    byte[] encode = Base64Utils.encode(bytes);//[89, 87, 73, 47]
    String s1 = Base64Utils.encodeToString(bytes);//YWI/

    byte[] decode = Base64Utils.decodeFromString(s1);//[97, 98, 63]
    String s2 = new String(decode, StandardCharsets.UTF_8);//ab?
}

@Test
public void test6(){
    String content = "ab>";
    byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 98, 62]
    String s1 = Base64Utils.encodeToString(bytes);//YWI+

    byte[] decode = Base64Utils.decodeFromString(s1);//[97, 98, 62]
    String s2 = new String(decode, StandardCharsets.UTF_8);//ab>
}

URL安全的Base64编码: 将/转换为_,将+转换为-

@Test
public void test5(){
    String content = "ab?";
    byte[] bytes = content.getBytes(Standar	dCharsets.UTF_8);//[97, 98, 63]

    byte[] bytes1 = Base64Utils.encodeUrlSafe(bytes);//[89, 87, 73, 95]
    String s = new String(bytes1, StandardCharsets.UTF_8);//YWI_
    String s1 = Base64Utils.encodeToUrlSafeString(bytes);//YWI_

    byte[] decode = Base64Utils.decodeFromUrlSafeString(s1);//[97, 98, 63]
    String s2 = new String(decode, StandardCharsets.UTF_8);//ab?
}

@Test
public void test5(){
    String content = "ab>";
    byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 98, 62]

    byte[] bytes1 = Base64Utils.encodeUrlSafe(bytes);//[89, 87, 73, 45]
    String s = new String(bytes1, StandardCharsets.UTF_8);//YWI-
    String s1 = Base64Utils.encodeToUrlSafeString(bytes);//YWI-

    byte[] decode = Base64Utils.decodeFromUrlSafeString(s1);//[97, 98, 62]
    String s2 = new String(decode, StandardCharsets.UTF_8);//ab>
}

3. Shell使用base64编码

编码:

# -n表示不打印尾随换行符
echo -n 'asnhlkqwe8uj12j3' | base64
YXNuaGxrcXdlOHVqMTJqMw==

解码:

# 或-d
echo 'YXNuaGxrcXdlOHVqMTJqMw==' | base64 --decode
asnhlkqwe8uj12j3

4. js中使用base64编码

打开浏览器的F12控制台,输入以下命令:

编码:

window.btoa("asnhlkqwe8uj12j3")
YXNuaGxrcXdlOHVqMTJqMw

解码:

window.aotb("YXNuaGxrcXdlOHVqMTJqMw")
asnhlkqwe8uj12j3

总结 

到此这篇关于什么是Base64以及在Java中如何使用Base64编码的文章就介绍到这了,更多相关Java使用Base64编码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中httpclient封装post请求和get的请求实例

    java中httpclient封装post请求和get的请求实例

    这篇文章主要介绍了java中httpclient封装post请求和get的请求实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot中使用拦截器的配置详解

    SpringBoot中使用拦截器的配置详解

    这篇文章主要介绍了SpringBoot中使用拦截器的配置详解,拦截器是 AOP 的一种实现,专门拦截对动态资源的后台请求,即拦截对控制层的请 求,使用场景比较多的是判断用户是否有权限请求后台,需要的朋友可以参考下
    2024-01-01
  • Java中的内存模型JMM详细解读

    Java中的内存模型JMM详细解读

    这篇文章主要介绍了Java中的内存模型JMM详细解读,Java 对内存的抽象模型如下,每个线程都有一块自己的私有内存(也称为工作内存),当线程使用变量时,会把主内存里面的变量复制到工作内存,线程读写变量时操作的是自己工作内存中的变量,需要的朋友可以参考下
    2023-12-12
  • java邮件发送的实现

    java邮件发送的实现

    本篇是用于java来实现邮件的发送的实例代码,基于smtp服务,有需要的可以参考一下。
    2016-10-10
  • 一行命令同时修改maven项目中多个module的版本号的方法

    一行命令同时修改maven项目中多个module的版本号的方法

    这篇文章主要介绍了一行命令同时修改maven项目中多个module的版本号的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Java中多个线程交替循环执行的实现

    Java中多个线程交替循环执行的实现

    有些时候面试官经常会问,两个线程怎么交替执行呀,本文就来详细的介绍一下Java中多个线程交替循环执行的实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • Java中Spock框架Mock对象的方法经验总结

    Java中Spock框架Mock对象的方法经验总结

    这篇文章主要分享了Spock框架Mock对象的方法经验总结,下文分享一些常用项目实战说明以及代码,供大家项目中参考,也具有一的的参考价值,需要的小伙伴可以参考一下
    2022-02-02
  • Java中的String不可变性实现

    Java中的String不可变性实现

    在Java编程中,String类的不可变性是一个被广泛讨论和利用的特性,本文主要介绍了Java中的String不可变性实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 基于Spring实现文件上传功能

    基于Spring实现文件上传功能

    这篇文章主要为大家详细介绍了Spring实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • java Class文件内部结构解析过程详解

    java Class文件内部结构解析过程详解

    java class的文件结构,java class文件结构是基于字节流的,用unicode进行编码,下面说说java Class文件内部结构分析
    2013-11-11

最新评论