java base64编码和解码用法解读

 更新时间:2026年04月14日 10:43:06   作者:西凉的悲伤  
文章主要介绍了Base64编码和解码的基本概念,以及其不适用于直接放在URL中传输的问题,然后详细介绍了标准Base64编码和解码,以及无填充Base64编码和解码的使用方法,最后还介绍了MIME友好型Base64编码和解码的方法,并提醒在使用时需要注意的问题

前言

Base64 编码会将字符串编码得到一个含有 A-Za-z0-9+/ 的字符串。

base64 编码和解码网上有些地方称为 base64 加密和解密,这是不准确的。base64 是不能用来加密和解密的,它只是一种编码解码方式,不能用于加密和解密,如果你想加密和解密可以选择如 AES、RSA 等加密算法。

标准的 Base64 并不适合直接放在 URL 里传输,因为URL编码器会把标准 Base64 中的“/”和“+”字符变为形如 “%XX” 的形式,而这些 “%” 号在存入数据库时还需要再进行转换,因为 ANSI SQL 中已将“%”号用作通配符。

一、base64编码和解码

1.标准的 base64 有填充的编码与解码

在 Base64 编码中,输出编码字符串的长度必须是 3 的倍数。如果不是 3 的倍数编码器会根据需要在编码结尾添加一个或两个填充字符 “=” 以满足此要求。在解码时,解码器会丢弃结尾的那些额外的填充字符进行解码。

开发中一般都使用此方法进行 base64 编码与解码,就像下面这样:

        //Base64编码
        String str = "hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy测试,base64测试加密解密hgdjuytiytiuyuytiuyirytr";
        String encodedString = Base64.getEncoder().encodeToString(str.getBytes());
        //输出:aGVsbG8h5L2g5aW9LOWwj+aYju+8geWTiC/lk4jlk4jvvIzkvaDljrvlk6rvvJ9zZ2RyNTYrPS8qJnl5eea1i+ivle+8jGJhc2U2NOa1i+ivleWKoOWvhuino+WvhmhnZGp1eXRpeXRpdXl1eXRpdXlpcnl0cg==
        System.out.println(encodedString); 

        //Base64解码
        byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
        String decodedString = new String(decodedBytes);
         //输出:hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy测试,base64测试加密解密hgdjuytiytiuyuytiuyirytr
        System.out.println(decodedString);

你会发现上面的标准的 base64 编码后的字符串除了大小写字母和数字还会有 +、/ 这两个符号,这不太适合用于 url 传输或作为 url 中的参数,就像前言中说的那样,如果要用于 url,可以采用 getUrlEncoder 和 getUrlDecoder 的 base64 编码:

        //Base64编码
        String str = "hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy测试,base64测试加密解密hgdjuytiytiuyuytiuyirytr";
        String encodedString = Base64.getUrlEncoder().encodeToString(str.getBytes());
         //输出:aGVsbG8h5L2g5aW9LOWwj-aYju-8geWTiC_lk4jlk4jvvIzkvaDljrvlk6rvvJ9zZ2RyNTYrPS8qJnl5eea1i-ivle-8jGJhc2U2NOa1i-ivleWKoOWvhuino-WvhmhnZGp1eXRpeXRpdXl1eXRpdXlpcnl0cg==
        System.out.println(encodedString);

        //Base64解码
        byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedString);
        String decodedString = new String(decodedBytes);
        //输出:hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy测试,base64测试加密解密hgdjuytiytiuyuytiuyirytr
        System.out.println(decodedString); 

2.base64无填充的编码与解码

无填充的编码编码后的字符串结尾不会添加 “=” 字符。

		//Base64编码
		String str = "hello!你好,小明!";
        String encodedString = Base64.getEncoder().withoutPadding().encodeToString(str.getBytes());
        System.out.println(encodedString); //aGVsbG8h5L2g5aW9LOWwj+aYju+8gQ

        //Base64解码
        byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
        String decodedString = new String(decodedBytes);
        System.out.println(decodedString); //hello!你好,小明!

注意:

除了上面介绍的 Base64 类进行 base64 编码和解码,jdk 的 BASE64Decoder 类也提供了 base64 编码和解码。

但是不推荐使用 BASE64Decoder 类进行编码和解码。

因为 BASE64Decoder 是对MIME友好的,编码后的字符串如果超过76个字符就会换行,所以 BASE64Decoder 编码后的字符串会后 \n\r 这样的字符,在一些处理 \n\r 的代码里可能会有问题。

如果你非要使用 BASE64Decoder 类进行编码和解码,请使用replaceAll(“\r|\n”, “”) 对编码后的 \n和 \r 进行替换。

二、MIME友好型base64编码和解码

MIME 友好型 base64 编码和解码即编码后如果长度每大于 76 就会加入 \r\n 这样的换行控制符

		//Base64编码
		String str = "727dced7-15c7-48c6-bb11-416ab51f98bc-2a19434a-3a64-496e-b07b-b51b0445384c-22525be7-82c7-4a72-8594-238712d4d59e";
        byte[] encodedAsBytes = str.getBytes();
        String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);
        System.out.println("编码:"+encodedMime);

        //Base64解码
        byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
        String decodedMime = new String(decodedBytes);
        System.out.println("解码:"+decodedMime); //727dced7-15c7-48c6-bb11-416ab51f98bc-2a19434a-3a64-496e-b07b-b51b0445384c-22525be7-82c7-4a72-8594-238712d4d59e

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java高并发下请求合并处理方式

    Java高并发下请求合并处理方式

    这篇文章主要介绍了Java高并发下请求合并处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 深入了解MyBatis分页机制

    深入了解MyBatis分页机制

    在企业项目的数据库操作中,分页查询是一个常见需求,尤其当数据量庞大时,MyBatis作为我们Java开发者的持久层框架,为分页提供了灵活的支持,本篇文章我们将深入探讨MyBatis的分页机制,使我们在实际开发项目中运用自如,需要的朋友可以参考下
    2023-12-12
  • java转化为exe程序步骤详解

    java转化为exe程序步骤详解

    在本篇内容里我们给大家分享了关于java转化为exe程序的具体步骤和相关知识点,需要的朋友们学习下。
    2019-03-03
  • java安全编码指南之:对象构建操作

    java安全编码指南之:对象构建操作

    这篇文章主要介绍了java安全编码指南之:对象构建操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring Boot 配置大全(小结)

    Spring Boot 配置大全(小结)

    本篇文章主要介绍了Spring Boot 配置大全(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Java中实现日志记录的方案总结

    Java中实现日志记录的方案总结

    在平时使用到一些软件中,比如某宝或者某书,通过记录用户的行为来构建和分析用户的行为数据,这就需要使用到日志系统来存储或者记录数据,小编为大家整理了几种Java日志方案,希望对大家有所帮助
    2024-12-12
  • Spring Security与JWT实现微服务安全认证的方法

    Spring Security与JWT实现微服务安全认证的方法

    本文详细介绍了在Spring Cloud微服务架构中使用Spring Security和JWT实现安全认证的完整方案,通过合理的架构设计、安全的实现方式和完善的防护措施,可以构建一个安全、可靠的微服务认证系统,本文介绍的非常详细,感兴趣的朋友一起看看吧
    2026-01-01
  • 你真的会使用Java的方法引用吗

    你真的会使用Java的方法引用吗

    这篇文章主要给大家介绍了关于Java方法引用的相关资料,方法引用是Java8的新特性,方法引用其实也离不开Lambda表达式,本文通过示例代码介绍的很详细,需要的朋友可以参考下
    2021-08-08
  • Java中的List与Set转换方式

    Java中的List与Set转换方式

    Java中,List和Set是两种基本的集合类型,它们在允许重复元素、元素顺序、实现类以及性能方面有着明显的区别,List允许重复元素并保持元素插入的顺序,常见实现有ArrayList、LinkedList和Vector;Set不允许重复元素
    2024-11-11
  • 深入探究Java编程是值传递还是引用传递

    深入探究Java编程是值传递还是引用传递

    大家好,本篇文章主要讲的是Java编程是值传递还是引用传递的探究,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-04-04

最新评论