Base64编码与解码

时间:2022-11-21 18:24:54

Base64原理

Base64是一种用64个字符来表示任意二进制数据的方法。对于二进制数据,每3个字节一组,编码为4个字节,即3×8bit=4×6bit。如下图,将连续的3个字节(8bit)分为4个6bit,然后将每个6bit高两位全补0,分别组成1字节(8bit),根据每个字节的数字查表的到对应的字符,进而得到编码后的字符串。
Base64编码与解码

  • 当原来二进制数据的字节数不是3的倍数时,可以在追加补1个或者2个\x00达到3的倍数,不过在编码的字符串要追加相应个数的=,表示愿二进制数据后追加了几个\x00

Java实现

jdk默认支持

    public static void jdkBase64(String srcMsg) {
        try {
            // 编码
            sun.misc.BASE64Encoder base64Encoder = new sun.misc.BASE64Encoder();
            String encodedMsg = base64Encoder.encode(srcMsg.getBytes());
            System.out.println(encodedMsg);
            // 解码
            sun.misc.BASE64Decoder base64Decoder = new sun.misc.BASE64Decoder();
            String decodedMsg = new String(base64Decoder.decodeBuffer(encodedMsg));
            System.out.println(decodedMsg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

commons-codec支持

public static void commonsCodecBase64(String srcMsg) {
        // 编码
        byte[] bytes = org.apache.commons.codec.binary.Base64.encodeBase64(srcMsg.getBytes());
        String encodedMsg = new String(bytes);
        System.out.println(encodedMsg);
        //解码
        bytes = org.apache.commons.codec.binary.Base64.decodeBase64(encodedMsg.getBytes());
        String decodedMsg = new String(bytes);
        System.out.println(decodedMsg);
    }

bouncy-castle支持

    public static void bouncyCastleBase64(String srcMsg) {
        // 编码
        byte[] bytes = org.bouncycastle.util.encoders.Base64.encode(srcMsg.getBytes());
        String encodedMsg = new String(bytes);
        System.out.println(encodedMsg);
        //解码
        bytes = org.bouncycastle.util.encoders.Base64.decode(encodedMsg);
        String decodedMsg = new String(bytes);
        System.out.println(decodedMsg);
    }

Python3实现

Python对Base64的支持和思想更为强大。

In [1]: import base64

In [2]: base64.b64encode('base64编码'.encode('utf-8'))
Out[2]: b'YmFzZTY057yW56CB'

In [3]: b'YmFzZTY057yW56CB'.decode('utf-8')
Out[3]: 'YmFzZTY057yW56CB'

In [4]: base64.b64decode('YmFzZTY057yW56CB'.encode('utf-8'))
Out[4]: b'base64\xe7\xbc\x96\xe7\xa0\x81'

In [5]: b'base64\xe7\xbc\x96\xe7\xa0\x81'.decode('utf-8')
Out[5]: 'base64编码'

由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种”url safe”的base64编码,其实就是把字符+和/分别变成-和_:

In [6]: base64.b64encode('加号'.encode('utf-8'))
Out[6]: b'5Yqg5Y+3'

In [7]: base64.urlsafe_b64encode('加号'.encode('utf-8'))
Out[7]: b'5Yqg5Y-3'

In [8]: base64.urlsafe_b64decode(b'5Yqg5Y-3')
Out[8]: b'\xe5\x8a\xa0\xe5\x8f\xb7'

In [9]: b'\xe5\x8a\xa0\xe5\x8f\xb7'.decode('utf-8')
Out[9]: '加号'

Python3中base64中其他方法请通过help(base64)查看。

参考资料:base64 - 廖雪峰的官方网站