格式设计在生活中随处可见,你的Excel表格、你打开的网页,你输入的密码,以及你的工资单在打印出来前。
什么是好的格式设计
好的格式设计照顾以下点:
- 方便识读
- 方便查找
- 节省空间
- 扩展潜力
你总要权衡些东西。
我为何要推荐专项练习格式设计?
格式者规则也,用于交互。
如果是你设计这个归根结底是为了读取。
按照规则存储,然后按照规则读取。
设计
1. 堆-零长度数组
。。。。。。
2. 空间紧密爱好者-压缩程序
。。。。。。
3. NTFS格式带来的紧密例子
。。。。。。
4. Reloc
重定位程序格式设计。
。。。。。。
5. 格式设计手法-正偏移与负偏移带来的灵活性和兼容性
可执行程序
。。。。。。
视频播放器
。。。。。。
6. 冗余带来的扩展性
通过预设冗余选项来兼容更多情况。
。。。。。。
7. 优雅的不兼容的例子
PE与COM。
。。。。。。
例子
字符串存储
序列化,倒置,不影响前面的东西。
反序列化的过程,偏移来往前走
。。。。。。
浑然一体-更紧致
在自带解压器的应用中,有个特别的技巧,可以省略寻找部分信息的步骤。这样做会让程序变得更加体积更小。
例如:总的数据项数是变化的,你可以这样:
1. 假定总的循环是567次。写出它的代码。
2. 提取它的汇编找到567所在位置
3. 用你的实际数据去动态的填充它
如果你不这样做的话,就需要将数据的长度放在一个位置,但是它的长度是固定的。特别是对于1对1解释器来说,这个数值和读取它的流程是可以避免的。
设计网络传输数据包
解决TCP分包粘包问题:
长度数据
- 版本号或者总长度(写总长度会方便很多)
- 序号及校验
- Option
- 数据类型
- 数据长度(可以用前面提到零数组)
struct st_X{
/*整个结构的长度*/
int length_of_this_struct;
/*过程ID*/
long ID_proc;
......
/*参数结构体总长度*/
length_Of_Argv_Struct
char argv_Struct[0];
}
FreeBSD内核中的递归页表
“在分层的页表中,如果在最高层的页目录中增加一个指向自己的页目录指针,就能把页表项(pte),页目录项(pde)抽象为一系列数组,从而高效的查找任意虚拟地址对应的pte,pde或者物理地址。”-下愚
。。。。。。