Android util 包 相关类解析二 Base64

来源:互联网 发布:办公软件怎么下载 编辑:程序博客网 时间:2024/05/07 16:35

不管多么庞大的东西,只要一点点积累,总会有所收获!

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 StringencodeToString(byte[] input, int flags)把给定的字节数组编码成字符串返回static StringencodeToString(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);

}








0 0
原创粉丝点击