java base64编码和解码

目录

  • 前言
  • 一、base64编码和解码
    • 1.标准的 base64 有填充的编码与解码
    • 2. 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,base64,base64加密与解密,base64编码,base64解码)