如何读取/写入文件的特定字节数

本文关键字:文件 字节数 何读取 读取 | 更新日期: 2023-09-27 17:49:22

我希望通过在大小块中构建它来创建文件。从本质上讲,我希望创建一个基本的文件系统。

我需要写一个标题,然后是一个"无限"可能的相同大小/结构的条目。重要的部分是:

  • 每个数据块需要单独读写
  • 头文件需要作为自己的实体可读/可写
  • 需要一种方法来存储这些数据,并能够快速确定其在文件中的位置

可以想象该文件类似于:

[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

我正在反向工作,但这可能有帮助。

我为二进制文件编写反编译器。通常有一个已知字节数的固定头。这包含特定的文件标识,因此我们可以识别我们正在处理的文件类型。

后面是一个固定的字节数,包含部分(数据组)的数量,这个数字告诉我们将有多少个数据指针。每个数据指针可能是四个字节(或任何您需要的),表示数据块的开始。由此我们可以算出每个区块的大小。然后,反编译器一次读取一个数据块,以获得每个数据块在文件中的大小和位置。接下来的工作是提取该字节块并执行所需的操作。

我们一次一个块地遍历文件。最后一个块的大小是指向文件末尾的开始指针。