谈格式设计-待完成

格式设计在生活中随处可见,你的Excel表格、你打开的网页,你输入的密码,以及你的工资单在打印出来前。

    • 什么是好的格式设计
    • 设计
      • 堆-零长度数组
      • 空间紧密爱好者-压缩程序
      • NTFS格式带来的紧密例子
      • Reloc
      • 格式设计手法-正偏移与负偏移带来的灵活性和兼容性
      • 冗余带来的扩展性
      • 优雅的不兼容的例子
    • 例子
      • 字符串存储
      • 浑然一体-更紧致
      • 设计网络传输数据包
      • FreeBSD内核中的递归页表

什么是好的格式设计

好的格式设计照顾以下点:

  1. 方便识读
  2. 方便查找
  3. 节省空间
  4. 扩展潜力

你总要权衡些东西。

我为何要推荐专项练习格式设计?

格式者规则也,用于交互。
如果是你设计这个归根结底是为了读取。
按照规则存储,然后按照规则读取。

设计

1. 堆-零长度数组

。。。。。。

2. 空间紧密爱好者-压缩程序

。。。。。。

3. NTFS格式带来的紧密例子

。。。。。。

4. Reloc

重定位程序格式设计。
。。。。。。

5. 格式设计手法-正偏移与负偏移带来的灵活性和兼容性

可执行程序
。。。。。。
视频播放器
。。。。。。

6. 冗余带来的扩展性

通过预设冗余选项来兼容更多情况。
。。。。。。

7. 优雅的不兼容的例子

PE与COM。
。。。。。。

例子

字符串存储

序列化,倒置,不影响前面的东西。
反序列化的过程,偏移来往前走
。。。。。。

浑然一体-更紧致

在自带解压器的应用中,有个特别的技巧,可以省略寻找部分信息的步骤。这样做会让程序变得更加体积更小。

例如:总的数据项数是变化的,你可以这样:
1. 假定总的循环是567次。写出它的代码。
2. 提取它的汇编找到567所在位置
3. 用你的实际数据去动态的填充它

如果你不这样做的话,就需要将数据的长度放在一个位置,但是它的长度是固定的。特别是对于1对1解释器来说,这个数值和读取它的流程是可以避免的。

设计网络传输数据包

解决TCP分包粘包问题:
长度数据

  1. 版本号或者总长度(写总长度会方便很多)
  2. 序号及校验
  3. Option
  4. 数据类型
  5. 数据长度(可以用前面提到零数组)
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或者物理地址。”-下愚
。。。。。。

你可能感兴趣的:(实践,数据结构,产品艺术)