1、计算机编码
(1)理解比特、字节、字符
(2)字节对齐
依赖编译器,对数据块进行划分,以便于数据读取。给定奇偶位,读取数据方式是不同的。
(3)数字的表示
原码,反码,补码
反码:正数反码与原码一致,负数最高位符号位不变,其他位取反
补码:正数的补码与原码一致,负数的补码在反码的基础上+1
====>在计算中,数的运算是运用补码进行的。
(4)Big-Endian与Little-Endian
网络传输中使用Big-Endian方法
bit发送中,串口通讯LSB优先发送,IIC集成电路系统总线是MSB优先发送,现代计算机为多字节并行处理,所以不用关心bit序列问题。
2、字符编码
(1)字符集与字符编码
(2)英文字符集与编码
(3)中文字符集与编码
(4)Unicode字符集与编码
Unicode字符集为全世界的字符提供了一个唯一的编码
UTF32:直接转成二进制,存储长度为4字节,考虑是Big-Endian还是little-Endian
UTF16:采用变长字节进行表示编码
1)对于编码在U+0000到U+FFFF之间的字符,用2个字节来表示
2)对于编码在U+10000到U+10FFFF之间的字符,用4个字节表示
UTF8:针对Unicode编码的可变长度字符编码实现形式,编码长度为1-4字节
物理存储问题解决方案
使用举例:
string str = “中”;
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
for(int i = 0; i < bytes.length;++i){
printf(”%x",bytes[i]);
//依次输出e4 b8 ad
3、序列化与反序列化
(1)技术背景
如何将程序中的结构体、对象等结构化内存对象转换成为扁平的二进制流?如何将二进制流还原为结构化内存对象?为了解决这些问题,出现了序列化和反序列化技术。
(2)技术特征
a、成熟度 :社区是否成熟,是否能及时跟进issue并解决bug
b、扩语言能力:扩语言能力是序列化与反序列化技术的核心指标之一,根据项目的实际需求是否需要跨语言。
c、易用性:门槛要低,接口要容易理解
d、扩展性:在增减字段的过程中,是否方便,是否对系统的数据存储、数据访问造成影响,具有向后兼容性。扩展性也是序列化和反序列化的核心指标之一。
(3)IDL序列化引擎
IDL(Interface Description Language,接口描述语言)
非IDL技术方案:json xml等
IDL序列化方案:Thrift 、Protocol Buffer、Avro等
1、Json
Json是一种基于JavaScript的轻量级数据交换格式,既能被机器理解,又便于用户阅读和编写。Json从用完全独立于语言的文本格式,支持c,c++、c#、java、JavaScript、Python等,这些特性使Json成为理想的跨语言数据交换方案。
在实际应用开发中,Json被广泛应用于数据传输、数据存储等场景。
下面内容包括:
(1)Json结构
(2)c++ 进行序列化
(3)开源库对比
1.1、json结构
Json包括另种数据结构:一种是键-值结构,一种是数据结构,数据结构包括了多个值。
1.1.1、json值类型
json支持的所有值类型
值类型 | 对应c++类型 |
---|---|
bool | bool |
number | int,double等 |
string | string |
object | 键-值结构,递归概念 |
array | 数组结构,数组元素是任意类型值,递归的概念 |
null | null |
1.1.2、Json语法
包括键-值结构和数组结构的例子
{
“name” : “jack”,
“age” : 10,
“height” : 1.75,
“is_male” : true,
“favarites” : [“reading”, “football”},
“children” : [{“name” : “lucy”, “gender”:“femalle”},{“name” : “lily”, “gender” : “female”}]
“school” : {“name” : “city school”, “class” :“m5”}
}