问题描述
我正在尝试设计一个 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
类来读取所有块可能是一个更好的主意。