为多种文件格式/标题设计文件阅读器

问题描述

我正在尝试设计一个 Reader 类,它可以读取多种文件类型(主要是某些内容的二进制表示)。 要从文件获取所有元数据,它将使用 Header 类,它会以某种方式告诉文件头的 Reader 类大小,(可能通过静态字段,idk)要读取和传递的 num 个字节到第一次读取时的标题。 Header 类将相应地解析一个标题,并提供一些抽象方法,如 std::size_t getChunkSize()。然后,头类将告诉读取器每个数据块的字节数。这就是我的想法。我怎样才能正确地表示这个层次结构,或者有更好的方法来做到这一点?

解决方法

一般来说,为二进制格式实现一个通用的 Reader 类是非常具有挑战性的。 由于某些文件格式具有可变长度的标头,我建议将标头的读取完全放入 Header 类中。 类似的东西:

struct Header {
 virtual size_t parse(uint8_t* buf,size_t len) = 0;
 virtual int getNumChunks() const = 0;
 virtual size_t getChunkSize(int chunk) = 0;
}

然后在您的 Reader 类中,您可以有一个读取方法,该方法首先解析 Header,然后根据块大小读取文件的其余部分。获取块开始的偏移方法对于某些文件格式也很有帮助。根据您要解析的文件格式,如果没有块头并且例如在这些块中有可变长度数组,则实际确定块大小也可能会出现问题。因此,实现一个 Chunk 类来读取所有块可能是一个更好的主意。