当前位置: 代码网 > it编程>编程语言>Java > java base64编码和解码用法解读

java base64编码和解码用法解读

2026年04月14日 Java 我要评论
前言base64 编码会将字符串编码得到一个含有 a-za-z0-9+/ 的字符串。base64 编码和解码网上有些地方称为 base64 加密和解密,这是不准确的。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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com