写点什么

Base64 的原理、实现及应用,面试字节跳动 Android 工程师该怎么准备

用户头像
Android架构
关注
发布于: 刚刚
  1. Base64 编码的主要的作用不在于安全性,而在于让内容能在各个网关间无错的传输,这才是 Base64 编码的核心作用。

  2. 在计算机中任何数据都是按 ascii 码存储的,而 ascii 码的 128~255 之间的值是不可见字符。而在网络上交换数据时,比如说从 A 地传到 B 地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个 Base64 编码,统统变成可见字符,这样出错的可能性就大降低了。

  3. Base64 编码在 URL 中的应用:


Base64 编码可用于在 HTTP 环境下传递较长的标识信息。例如,在 Java 持久化系统 Hibernate 中,就采用了 Base64 来将一个较长的唯一标识符(一般为 128-bit 的 UUID)编码为一个字符串,用作 HTTP 表单和 HTTP GET URL 中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在 URL(包括隐藏表单域)中的形式。此时,采用 Base64 编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。


然而,标准的 Base64 并不适合直接放在 URL 里传输,因为 URL 编码器会把标准 Base64 中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为 ANSI SQL 中已将“%”号用作通配符。


(1


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


)为解决此问题,可采用一种用于 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 编码


如AAwww.baidu.com/img/sslm1_logo.gifZZ用Base64编码得到QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==


  • ??三、在上面得到的字符串前加上“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 提供了以下几种

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Base64 的原理、实现及应用,面试字节跳动Android工程师该怎么准备