Base64编码是基于64个字符A-Z,a-z,0-9,+,/的编码方式,由于2的6次方正好为64,因此就用6bit就能够表示出64个字符,eg:000000对应A,000001对应B。正则表达式
**BASE64 的编码原理:**都是按字符串长度,以每 3 个 字符(1Byte=8bit)为一组,而后针对每组,首先获取每一个字符的 ASCII 编码(字符'a'=97=01100001),而后将 ASCII 编码转换成 8 bit 的二进制,获得一组 3 * 8=24 bit 的字节。而后再将这 24 bit 划分为 4 个 6 bit 的字节,并在每一个 6 bit 的字节前面都填两个高位 0,获得 4 个 8 bit 的字节,而后将这 4 个 8 bit 的字节转换成十进制,对照 BASE64 编码表 (下表),获得对应编码后的字符。 算法
注:1. 要求被编码字符是8bit的,因此须在ASCII编码范围内,\u0000-\u00ff,中文就不行。 2. 若是被编码字符长度不是3的倍数的时候,则都用0代替,对应的输出字符为“=”数据库
Base64编码本质上是一种将二进制数据转成文本数据的方案。对于非二进制数据,是先将其转换成二进制形式,而后每连续6比特(2的6次方=64)计算其十进制值,根据该值在A--Z,a--z,0--9,+,/ 这64个字符中找到对应的字符,最终获得一个文本字符串。基本规则以下几点:编程
解码原理是将4个字节转换成3个字节.先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位,这样就还原了。安全
一、字符长度为能被3整除时:好比“Tom” : bash
二、字符串长度不能被3整除时,好比“Lucy”: 微信
实现简单的数据加密,使用户一眼望去彻底看不出真实数据内容,base64算法的复杂程度要小,效率要高相对较高。网络
Base64编码的主要的做用不在于安全性,而在于让内容能在各个网关间无错的传输,这才是Base64编码的核心做用。编程语言
在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,好比说从A地传到B地,每每要通过多个路由设备,因为不一样的设备对字符的处理方式有一些不一样,这样那些不可见字符就有可能被处理错误,这是不利于传输的。因此就先把数据先作一个Base64编码,通通变成可见字符,这样出错的可能性就大下降了。网站
Base64 编码在URL中的应用:
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java持久化系统Hibernate中,就采用了Base64来将一个较长的惟一标识符(通常为128-bit的UUID)编码为一个字符串,用做HTTP表单和HTTP GET URL中的参数。在其余应用程序中,也经常须要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不只比较简短,同时也具备不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,由于URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还须要再进行转换,由于ANSI SQL中已将“%”号用做通配符。
(1)为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改为了“-”和“”,这样就免去了在URL编解码和数据库存储时所要做的转换,避免了编码信息长度在此过程当中的增长,并统一了数据库、表单等处对象标识符的格式。 (2)另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改为了“!”和“-”,由于“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中均可能具备特殊含义。 此外还有一些变种,它们将“+/”改成“-”或“.”(用做编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“:”(用于XML中的Name)。
不少下载类网站都提供“迅雷下载”的连接,其地址一般是加密的迅雷专用下载地址。 如thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg== 其实迅雷的“专用地址”也是用Base64加密的,其加密过程以下:
如www.baidu.com/img/sslm1_logo.gif变成 AAwww.baidu.com/img/sslm1_l…
thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==
//对字符串进行Base64编码
public void base64Encode(View view) {
String str = "a";
stringBase64 = Base64.encodeToString(str.getBytes(), Base64.NO_PADDING);
test.setText("a 的Base64编码为:"+stringBase64);
}
复制代码
//对字符串进行Base64解码
public void base64Decode(View view) {
byte[] decode = Base64.decode(stringBase64, Base64.DEFAULT);
String string = new String(decode);
test.setText("base64解码为:"+string);
}
复制代码
File file = new File("/storage/emulated/0/pimsecure_debug.txt");
FileInputStream inputFile = null;
try {
inputFile = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
inputFile.read(buffer);
inputFile.close();
encodedString = Base64.encodeToString(buffer, Base64.DEFAULT);
Log.e("Base64", "Base64---->" + encodedString);
} catch (Exception e) {
e.printStackTrace();
}
复制代码
File desFile = new File("/storage/emulated/0/pimsecure_debug_1.txt");
FileOutputStream fos = null;
try {
byte[] decodeBytes = Base64.decode(encodedString.getBytes(), Base64.DEFAULT);
fos = new FileOutputStream(desFile);
fos.write(decodeBytes);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
复制代码
不管是编码仍是解码都会有一个参数Flags,Android提供了如下几种
DEFAULT 这个参数是默认,使用默认的方法来加密
对“a”进行Base64编码结果为:YQ==,而且编码后出现换行符
NO_PADDING 这个参数是略去加密字符串最后的”=”
对“a”进行Base64编码结果为:YQ
NO_WRAP 这个参数意思是略去全部的换行符(设置后CRLF就没用了)
对“a”进行Base64编码结果为:YQ==,而且编码后不出现换行符
CRLF 这个参数看起来比较眼熟,它就是Win风格的换行符,意思就是使用CR LF这一对做为一行的结尾而不是Unix风格的LF
URL_SAFE 这个参数意思是加密时不使用对URL和文件名有特殊意义的字符来做为加密字符,具体就是以-和_取代+和/
对“a”进行Base64编码结果为:YQ==,而且编码后出现换行符