Base64
原理
Base64
是一种用64个字符来表示任意二进制数据的方法。对于二进制数据,每3个字节一组,编码为4个字节,即3×8bit=4×6bit
。如下图,将连续的3个字节(8bit
)分为4个6bit
,然后将每个6bit
高两位全补0,分别组成1字节(8bit
),根据每个字节的数字查表的到对应的字符,进而得到编码后的字符串。
- 当原来二进制数据的字节数不是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 - 廖雪峰的官方网站