数据编解码及序列化技术

1、数据编解码:
数据编解码的最主要作用是将非标准格式的数据转为某种协议的标准格式,使这种协议可以传输、处理这种数据。举个最简单的例子,网页中很多一个网页里面嵌套了另一个网页或者汉字及特殊符号等,会转码为%23%67这类东西,这实际上是一种转码方式,js函数名叫encodeURI。由于url地址的特殊符号具有特殊含义,比如/?&及空格等,如果实际需要传输的参数带了这些符号,将导致格式错误。所以通常处理方式是将这些符号转为%XX格式,使特殊符号可以传递。这些方式都不能达到加密的效果,有经验的开发者都可以看一眼转码后的数据就能知道原始数据内容。
主要软件编码方式有三种:Base64、encodeURI(js函数)、encodeURIComponent(js函数)
Base64的主要特点是,编码后的数据只有0-9、a-z、A-Z、+/以及末尾可能的空格,长度为4的整数倍。编码后的数据大约比原数据长了1/3;
encodeURI是使用的最多的web请求的url转换,它将转码掉特殊字符,然后使请求用于HTTP协议的通讯;
encodeURIComponent稍微特殊一点,它除了编码特殊字符外,还将编码保留字符,编码的更完全;
另外有一个escape这个函数不太规范,因为它编码的不是UTF8编码,不便于不同设备间的通讯,所以它不再是主流编码方式;
除此之外还有数据压缩,也可以从某种层面上将其称之为编码及解码。
主要硬件编码方式就多了,Web技术刚出来就有一堆比如海明码等,然后选入标准的2G一种、3G一种、4G一种、5G两种、Wifi一种。硬件编码主要用于电磁信号传输过程中由于距离太长或者被干扰,导致传输后的信号乱码后,纠正错误的编码。著名的5G信道编码之争的三个编码为:LDPC、Polar和Turbo。硬件编码主要是硬件工程师写入硬件设备的编码方式,由于和软件是不同层次,所以软件中的纠错编码是相当的少了,可能最多的是二维码,就算有一小部分模糊也能正确的扫出结果。

2、序列化:
主要是软件通信以及存取时候使用,通常将一个内存结构模型序列化为一种顺序的结构便于存取及通信。使用的最多的两种结构为Json和XML。这两种结构主要用于简单的内存结构,对于复杂的结构就有些无力了。还有很多3D游戏的模型文件,比如MOD之类的,都属于3D模型的序列化数据。
序列化有多重要呢?举个简单的例子,以C++结构体为例,如果不使用序列化,那么将需要考虑内存pack长度、各种数据结构的长度比如32位或64位,主机字节序或网络字节序等等……如果是不同的语言,那么难度将更高。
Json数据主要长这样:{"a":"test1","b":"test2"}
XML数据主要长这样:<node><a>test1</a><b>test2</b></node>
由于这两类数据都太灵活,很可能有不标准的结构,所以出现一种技术:Schema,上面两种序列化结构都能用,主要用于数据结构的格式校验。这个东西在ISO(国际标准化组织)里面用的最多,涉及Json和XML的全是Schema。比如XML Schema详见XML Schema (一种XSL) 简单介绍,基于这两类数据结构的衍生版本也非常多,比如Json有Jsonb,Bson等,XML有XAML、HTML等。Json及衍生序列化格式渐渐偏向于储存内存数据结构,XML及衍生序列化格式渐渐偏向于存储UI布局。不过这也不是绝对的,在需要时完全可以反过来。