不管多么庞大的东西,只要一点点积累,总会有所收获!
Base64我想大家都不会陌生,那下面我来发一下在维基百科里面它的具体概念把。
一
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。
二
由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可
用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
三
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。
上面这三点你仔细去读了吗?如果没有看明白请再重新看一遍哦。
经上总结:Base64可以用64个可打印字符来表示二进制数据,也就是说 用我们经常熟知的A-Z a-z 0-9来表示二进制数据
既然理解了Base64概念,那我们看一下它的原理把:
在MIME格式的电子邮件中,base64可以用来将binary的字节串行数据编码成ASCII字符串行构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写
字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
完整的base64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换
行。可以估算编码后数据长度大约为原长的135.1%。
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲器中剩下的bit用0补足。然后每次取出6(因为26=64)
个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
当原数据长度不是3的整数倍时, 如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么
都不要加,这样才可以保证数据还原的正确性。
看了这么多,我想肯定有人会问,Base64即提供了加密方法又提供了解密方法,那对于安全来说不是一点意义都没有吗?
基于这一点我想告诉大家Base64的主要功能不是加密,它主要的用途是把一些二进制数转成普通字符用于传输,由于一些二进制字符在传输协议中属于控制字符,不能直接传输,需要转换才能传输。
好了原理基本就是这样,那让我们继续看android util中的Base64类把,逐渐揭开其神秘的面纱。
static byte[] |
decode(byte[] input, int flags) 解码参数1中提供的字节数组,并返回一个已经解码的字节数组,可直接转换成字符串查看 |
static byte[] |
decode(byte[] input, int offset, int len, int flags)从offset个字节开始,解码参数1中提供的字节数组len个,并返回一个已经解码的字节数组,可直接转换成字符串查看 |
static byte[] |
decode(String str, int flags)解码参数1中提供的字符串,并返回一个已经解码的字节数组 |
static byte[] |
encode(byte[] input, int flags)编码参数1中提供的字节数组,并返回一个已经编码的字节数组,可直接转换成字符串查看 |
static byte[] |
encode(byte[] input, int offset, int len, int flags)从offset个字节开始,编码参数1中提供的字节数组len个,并返回一个已经编码的字节数组,可直接转换成字符串查看 |
static String |
encodeToString(byte[] input, int flags)把给定的字节数组编码成字符串返回 |
static String |
encodeToString(byte[] input, int offset, int len, int flags)把给定的字节数组从offset位置开始编码len个长度并返回其编码后的字符串 |
import android.util.Base64;
public class Base64Util {
/**
* Base64编码
* @param 要编码的字符串
* @return 编码完成的字符串码
*/
public static String getEncodeStr(String str){
byte byteArr[]=Base64.encode(str.getBytes(), Base64.DEFAULT);
return new String(byteArr);
}
/**
* Base64解码
* @param 被编码的字符串
* @return 解码完成,输出原本字符串
*/
public static String getDecodeStr(String encodeStr){
byte byteArr[]=Base64.decode(encodeStr, Base64.DEFAULT);
return new String (byteArr);
}
}