敞开生长之旅!这是我参与「日新计划 2 月更文应战」的第 9 天,点击查看活动概况

前语

前几天写了一篇对跨端通讯的思考,当时趁便想到了数据这一块,所以也能够收拾一下,单独拿出来说说平时开发中涉及到哪些对数据的处理方式。

Base64

之前详细写过一篇关于Base64的文章

/post/715584…

简略来说,Base64便是把你的数据转成只有64个无特别符号的字符,首要常用于加密后之类的生成的字节数组,转成Base64方便进行数据传输,假如不转的话就会是乱码,会看得很难受,这些乱码在某些编码下展示出来的是豆腐块,有点扯远了。
还有便是比方中文啊,emoji啊这类的字符,在某些状况下也需要转成Base64进行传输。

缺点便是只用64个字符表示,还有我之前剖析过base64的转化原理,经过其原理能很容易看出,终究的转化成果比较转化前的数据更加长。

JSON/XML

这些就比较常见了,对数据依照必定的格局进行封装。为什么要说这个呢?因为他这些封装是约好熟成的方式,和上面的Base64的转化方式就不同,适当所以我们约好好依照这个格局包装数据,然后传输,自己再依照这个格局去解开拿到数据。

大都用于跨端传输,像客户端请求服务端拿数据,那不也便是跨端嘛,其实这个所有人都用到,但为什么说这个呢?仍是那个跨端通讯的问题,跨端通讯没办法直接传目标,实际传目标的效果是转json传的String,然后另外一端再创立一个自己端的目标,解析json,把json数据填充进去。

还有,既然是约好的,那其实咱们自己也能够依照咱们自己的约好去做跨端的数据传送,只不过json这种格局,是已经规划得很好了,你很难再去约好一种比这个格局更好的封装。

PS:不要觉得json我们都在用,都形成肌肉记忆了,没有什么难的。其实比方像gson\fastjson这些,人家去研究解析json的算法,也是一个技术点。你觉得简略,那是因为你在运用,但让你从0去做,你不必定能做出来。

URL编码

又叫做urlencode,望文生义用于url连接中的一种对数据的操作。
它将特别字符转成16进制并且在前面加%,那同理解析拿数据的时分也是根据%去做判别。

为什么会呈现这种编码呢?首要是为了避免抵触,咱们都知道比方get请求都会在url链接后边拼参数,避免在传输中呈现问题,所以把特别字符都进行编码。

比方www.baidu.com/?aaaaaaa 会编码成https%3A%2F%2Fwww.baidu.com%2F%3Faaaaaaa

该编码首要用于对url的处理。

驼峰和下划线

这其实是一个命名方式,不同的端有不同的命名习气,比方java习气便是用驼峰,可是仍是跨端问题,有些时分存在写死的状况,当然这个代码不是你写的,也可能是前人留下的(我没有暗示什么)。但假如你的代码中呈现两种命名方式会让代码看着比较乱。不要紧咱们能够做个转化,我这儿以下划线转驼峰为例

private String lineToHump(String str) {
    if (TextUtils.isEmpty(str)) {
        return str;
    }
    String[] strs = str.split("_");
    if (strs.length < 2) {
        return str;
    }
    StringBuilder result = new StringBuilder(strs[0]);
    for (int i = 1; i < strs.length; i++) {
        String upper = (strs[i].charAt(0) + "").toUpperCase();
        if (strs[i].length() > 1) {
            result.append(upper).append(strs[i].substring(1));
        } else {
            result.append(upper);
        }
    }
    return result.toString();
}

能够写个转化办法,我这儿只是随便写个Demo,这段代码是还能进行优化的,首要大约便是这个意思。

上面说的json首要是为了说数据的封装和解封,这儿首要是说数据的转化,我的意思是在开发中,咱们也会呈现不同端的数据形式不同,咱们不需要在代码中向其它端进行妥协,只用写个办法去做数据的转化,在本端仍是正常写本端的代码就行。

摘要

摘要算法,简略来说便是将原数据以一种算法生成一段很小的新数据,这段新数据首要是用来标识这段原数据。怎样还有点绕,总归便是生成一个字符串来标识原数据 。对任意一组输入数据进行核算,得到一个固定长度的输出。

也可称之为哈希算法,最重要的是它取决于它的这个规划思想,它是一个不可能逆的进程,一般不能根据摘要拿到原数据,留意我用了一般,因为这个世界上存在许多老六。

摘要算法中当时最经典的是SHA算法和MD算法,SHA-1、SHA-256和MD5。其中他们加密进程能够单独写一篇文章来说,这儿就不过多解释。

摘要算法最首要的运用场景是校验数据的完整性和是否有被篡改。比方CA证书的校验,android签名的校验,会拿原数据做摘要和传过来的摘要相比照,是否一样,假如纷歧样阐明数据有被篡改正。再比方我本地有个视频,我怎样判别后台这个视频是不是更新了,要不要下载,能够对视频文件做MD5,然后和后台文件的MD5进行比照,假如一样阐明视频没有更新,假如纷歧样阐明视频有更新或者本地的视频不完整(PS:对文件做摘要可是一个耗时的进程。)

加密

讲完摘要能够抓住时机说说加密,加密望文生义便是把明文数据转成密文,然后另一方拿到密文之后再转成明文。

加密和摘要不同在于,它们的实质都不同,摘要是为了验证数据,加密是为了安全传输数据。它们在表现上的不同体现在,摘要是不可逆,加密是可逆的。

加密在当时的规划上又分为对称加密和非对称加密,干流的对称加密是AES算法,干流的非对称加密是RSA算法。对称加密的加密和解密运用的密钥是相同的,非对称是不同的 ,所以非对称加密更为安全,可是也会更耗时。

当然你也能够不必这些算法,假如你是直接触摸这些算法,好像是要付专利费的,每年给多少钱别人才给你用这个算法,资本家不就喜爱搞这种东西吗?扯远了。你也能够运用自己约好的算法,只不过在高手面前可能你的算法适当于裸奔,要是你真能规划出和这些算法旗鼓适当的算法,你也不会来看我这么捞的文章。

所以加密,是为了确保数据的安全,假如你传输的数据觉得被看了也无所谓,那就不必加密,因为它耗时。假如你只是为了避免数据被改,也不必加密,用摘要就行。假如你是为了传输seed,那我主张你加密[狗头]

通讯协议

json那里咱们有说,它便是两边约好好的数据格局。以小见大,通讯协议也是两边约好的一种数据传输的进程。通讯协议会更为严谨,并且会许多不同,各家有各家的通讯协议,不是像json这种便是我们都用一样的。

比方咱们的网络传输,就有许多协议,http协议、tcpip协议等,这些在网络中是规定好的,我们都用这一套。再比方蓝牙协议,也是要依照同一个规范去运用。可是硬件的协议就多种多样了,不同的硬件厂商会定义不同的通讯协议。

二维码

二维码也是对数据封装的一种形式,能够经过把数据变成图画,然后是扫码后再获取到数据,这么一种形式我感觉能想出这个法子的人挺牛逼的。

它所涉及的内容许多,详细能够参考这篇文章,我觉得这个大佬写得挺好的 二维码生成原理 – 知乎 (zhihu.com)

我之前自己去用java实现,终究没画出来,感觉原理是没问题的,应该是我哪里细节没处理好,这儿就简略介绍一下就行。其实简略来说,它便是有一个模板的状况下,把数据填充到模板里面。

这儿借大佬的图,模板便是这样的

浅谈开发中对数据的编码和封装

然后依照规矩去填充数据

浅谈开发中对数据的编码和封装

这样去填充,其实会让黑点散布不均匀,填充之后还会做一个转化。

可是二维码也有缺点,缺点便是数据量大的时分,你的二维码很难被识别出,可是不得不说能想出这个办法,能规划出这个东西的人,的确牛逼。