赞
踩
“Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符
来表示二进制数据的方法”。
什么是“可打印字符”呢?为什么要用它来传输8Bit字节码呢?在回答这两个问题之前我们有必要来思考一下什么情况下需要使用到Base64?Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。什么是可打印字符?在ASCII码中规定,0~31、127这33个字符属于控制字符,
32~126这95个字符属于可打印字符
,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。
Base 64主要用途不是加密,而是把一些二进制数转成普通字符,方便在网络上传输。 由于一些二进制字符在传输协议中属于控制字符,不能直接传送,所以需要转换一下才可以。由于某些系统中只能使用ASCII字符,Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,Base64特别适合在http,mime协议下快速传输数据。比如网络中图片的传输。
Base64,并非安全领域下的加密解密算法。虽然经常遇到所谓的base64的加密解密。但base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是方式初级又简单。
Base64编码将一个8位子节序列拆散为6位的片段,而且这每个6位的片段都会被分配一个字符,那这个是个什么字符呢?其实它是base64字母表中的64个字符之一。而这64个字符可是有讲究的,是选择了最常用而且兼容性最好的64个字符。所以可以算出base64编码后的字符串大约比编码前大了33%,因为用8位来表示6位。
Base64编码是基于**64个字符 ** A-Z
a-z
0-9
+
/
,刚好 2 的 6次方 = 64 ,因此每一个base64字符占了 6bit
,字符表如下
索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
以下图的表格为示例,我们具体分析一下整个过程。
上面是按照三个字节来举例说明的,如果字节数不足三个,那么该如何处理?
public static void main(String[] args) throws UnsupportedEncodingException {
// 编码 将 “你好” 转化为base64编码
String encode = Base64.getEncoder().encodeToString("你好".getBytes("UTF-8"));
System.out.println(encode);
// 解码
byte[] decode = Base64.getDecoder().decode(encode);
System.out.println(new String(decode, "UTF-8"));
}
输出 :
5L2g5aW9
你好
public static void main(String[] args) throws IOException { // 下方为一张图片转化为 base64编码之后的字符串 String src = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADw0lEQVRYR8WXW2xUVRSGv3/PaBVBYjXU1BaxijGgBKExarwU" + "NN5IFB/smxhCZ4aiaIzxGarRaEKMkcTpDK0SL9HYByExxhgM4ANF0QhaLw8YFas0xaQqD6btnL3MPp0mbSnNnBHLTiYzJ7POXv9a" + "6//X2lucoWVwMXCP4O0kWyqJ8Uy2BlcCbwpuTrLnmQSwAvhEcNHZAvAEcLfgvlkHYLAQ+AV4XLD9bAD4FhgRXJ/EebD9zxww+B" + "WYozEVxMtgNXAd8I5gcCZQVQMwuAk4APQIWsuObwA2A18JXqokG1UBMGgB9gI7BesN5gMvAHMFD1fieNwmMQCDG4GPgJcFWw0WA" + "B8CRwQbkjivigMGrwN3Ac2C4wZPAduARkH/bACwcsdbV657KEWLqiR0NSV4HmgQTAIAtAp6ZiMDy4CPgdWC7wweAt4DepPOgao4UE5" + "7INstQQHl59cY+71KsC9JFhKXYEKz2VJm/q6pspwVAOXItwg6DBYB72pMoolW4gxkC7a2mNOuCZm4E1gLPDNd280Ubal3DHe36eh" + "0yCoCkC3YQOjrI+fSsXO9/py4kcE6wRvTbZ7rtCXAHSbuB44VczqlUc0IIJu3rTgeAfImPrNo8vBqPvz+wi+WP3gsOE+JWu9odNBgRq" + "MTb3Vm9UH4L9dpt5nY7x3NXRl9ORHsjADa8tbiHEF21wCLTaSnRiojZKTXxB/Oc1TGj53t+m2qXbZg5j2ruto1SSUVlSARq6YxLmdyfj" + "GnJ08JoJLNN+ZtkXf8BGSAb0wMldIMXX4FQwM/0GBplphnKbBMYtiVeDq/SUOPdVv98CjbJNLFnOKRXRWA8FK2YIEL9wJNjI3f8U8owWE" + "TR5ynzzv6LvudvuOXssbEJhnPFTbq09MF+r+UYEPeru1uV18l2a0YQEzIcBBxcbQ/pyJOeMeg8ywowWLnuEqOE4WMdlfieNymcgA7bGX" + "KUzBYeRoHozIOejg0WsOzU/tF4hK07bBbUxY3kEgR2ydKq/1VayqlaXJGk8EFPqL3r0s41NOqKEn0wXbaDGSKtlfGXO9o7coosD/x2vyKXfjPOaxIOa4OLxdyKlasgmzBwuUiXLXqgPPDKdeMz88b4cXhGtpjBXiECydw5oXDaPl7nil+RsZ+79kXGk+maMtlPFDMqaMqGWYLNieQzTvqTNSlIg6aYpnVS/ztoV/G16U0gzVQH5WoN1Eri4MIg+pAMafQQ6rrA6ERRdDiUtxuRgtGLYovJMPhUmJiQMZJWQzmZAAloz+K2NP1qL6fqX7/AlDqSDC4Es2EAAAAAElFTkSuQmCC"; byte[] decode = Base64.getDecoder().decode(src); // 将解码后的 图片保存到文件夹中 FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/img.jpg")); fileOutputStream.write(decode); }
参考 :
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。