我希望通过在大小块中构建它来创建文件。从本质上讲,我希望创建一个基本的文件系统。
我需要写一个标题,然后是一个"无限"可能的相同大小/结构的条目。重要的部分是:
- 每个数据块需要单独读写
- 头文件需要作为自己的实体可读/可写
- 需要一种方法来存储这些数据,并能够快速确定其在文件中的位置
可以想象该文件类似于:
[HEADER][DATA1][DATA2][DATA3][...]
处理这种事情的正确方法是什么?假设我想从文件中读取DATA3,我怎么知道数据块从哪里开始?
如果我理解正确,并且您需要一种方法来为您的DATA
块分配一种名称/id,您可以尝试引入另一种类型的块。
我们称它为TOC
(目录)。因此,文件结构看起来像[HEADER][TOC1][DATA1][DATA2][DATA3][TOC2][...]
。
TOC
chunk将包含多个DATA
chunk的名称/id和引用。此外,它将包含一些内部数据,例如指向下一个TOC
块的指针(因此,您可以将每个TOC
块视为链表节点)。
在运行时,所有TOC
块都可以表示为一种HashMap
,其中key是DATA
块的名称/ID, value是其在文件中的位置。
可以在header中存储chunk的大小。如果块的大小是可变的,则可以存储指向实际块的指针。一个有趣的可变大小的设计是在postgres堆文件页面。http://doxygen.postgresql.org/bufpage_8h_source.html
我正在反向工作,但这可能有帮助。
我为二进制文件编写反编译器。通常有一个已知字节数的固定头。这包含特定的文件标识,因此我们可以识别我们正在处理的文件类型。
后面是一个固定的字节数,包含部分(数据组)的数量,这个数字告诉我们将有多少个数据指针。每个数据指针可能是四个字节(或任何您需要的),表示数据块的开始。由此我们可以算出每个区块的大小。然后,反编译器一次读取一个数据块,以获得每个数据块在文件中的大小和位置。接下来的工作是提取该字节块并执行所需的操作。
我们一次一个块地遍历文件。最后一个块的大小是指向文件末尾的开始指针。