我正在寻找通过以大小块构建文件来创建文件。本质上,我希望创建一个基本的文件系统。
我需要编写一个标题,然后是“无限”个可能的相同大小/结构的条目。重要的部分是:
- 每个数据块都需要单独读/写
- 标头需要作为自己的实体可读/可写
- 需要一种方法来存储此数据并能够快速确定其在文件中的位置
会想象该文件类似于:
[HEADER][DATA1][DATA2][DATA3][...]
处理这样的事情的正确方法是什么?假设我想从文件中读取 DATA3,我怎么知道该数据块从哪里开始?
我正在寻找通过以大小块构建文件来创建文件。本质上,我希望创建一个基本的文件系统。
我需要编写一个标题,然后是“无限”个可能的相同大小/结构的条目。重要的部分是:
会想象该文件类似于:
[HEADER][DATA1][DATA2][DATA3][...]
处理这样的事情的正确方法是什么?假设我想从文件中读取 DATA3,我怎么知道该数据块从哪里开始?
如果我理解正确并且您需要一种方法来为您的块分配一种名称/ID DATA
,您可以尝试引入另一种类型的块。
我们称之为TOC
(目录)。因此,文件结构将如下所示[HEADER][TOC1][DATA1][DATA2][DATA3][TOC2][...]
。
TOC
块将包含名称/ID 和对多个DATA
块的引用。此外,它将包含一些内部数据,例如指向下一个TOC
块的指针(因此,您可以将每个TOC
块视为一个链表节点)。
在运行时,所有TOC
块都可以表示为一种HashMap
,其中 key 是DATA
块的名称/ID,值是它在文件中的位置。
I am working in reverse but this may help.
I write decompilers for binary files. Generally there is a fixed header of a known number of bytes. This contains specific file identification so we can recognize the file type we are dealing with.
Following that will be a fixed number of bytes containing the number of sections (groups of data) This number then tells us how many data pointers there will be. Each data pointer may be four bytes (or whatever you need) representing the start of the data block. From this we can work out the size of each block. The decompiler then reads the blocks one at a time to get the size and location in the file of each data block. The job then is to extract that block of bytes and do whatever is needed.
We step through the file one block at a time. The size of the last block is the start pointer to the end of the file.
我们可以在标头中存储块的大小。如果块的大小是可变的,您可以存储指向实际块的指针。一个有趣的可变大小设计是在 postgres 堆文件页面中。http://doxygen.postgresql.org/bufpage_8h_source.html