Base64 的原理、实现及应用,面试字节跳动 Android 工程师该怎么准备
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 加密的,其加密过程如下:
??一、在地址的前后分别添加 AA 和 ZZ
如www.baidu.com/img/sslm1_logo.gif变成 AAwww.baidu.com/img/sslm1_l…
??二、对新的字符串进行 Base64 编码
??三、在上面得到的字符串前加上“thunder://”就成了
thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==
五、Base64 具体实现
1. 对字符串进行 Base64 编码
//对字符串进行 Base64 编码 public void base64Encode(View view) {String str = "a";stringBase64 = Base64.encodeToString(str.getBytes(), Base64.NO_PADDING);
test.setText("a 的 Base64 编码为:"+stringBase64);}
2. 对字符串进行 Base64 解码
//对字符串进行 Base64 解码 public void base64Decode(View view) {byte[] decode = Base64.decode(stringBase64, Base64.DEFAULT);String string = new String(decode);
test.setText("base64 解码为:"+string);}
3. 对文件进行 Base64 编码
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();}
4. 对文件进行 Base64 编码
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();}
5. 针对 Base64.DEFAULT 参数说明
无论是编码还是解码都会有一个参数 Flags,Android 提供了以下几种
评论