【问题标题】:How do you lay out your custom binary file format?您如何布置自定义二进制文件格式?
【发布时间】:2011-10-02 21:02:50
【问题描述】:

每个应用程序都有自己的自定义二进制文件格式(例如 .mpq、.wad)。最重要的是,它通常是带拉链的。

所以,我的问题是,您如何巧妙地/巧妙地布局文件的二进制内容。开头是否有类似“目录”的结构?将所有内容转储到一个文件中会更好吗?

假设你有一个Shapes 的数组,并且在每个Shape 中都是变形的顶点数据(所以顶点数据已经从它最初加载的文件中改变了,所以应该重新保存)。

class Shape
{
    vector<Vertex> verts ;
} ;

class Sphere : public Shape { } ; // ...more geometric shapes (Tet, Cube) are defined..

class Model : public Shape { } ; // general model "Shape" loaded from file

vector<Shape*> shapes ; // save me!  contents are mix of Model, Sphere, Tet..
// each with variable number of verts

【问题讨论】:

  • 会说它很大程度上取决于要序列化的数据。真的太笼统的问题无法回答...
  • 我真的在寻求有关如何映射事物的技术。让我用一个例子来更新这个问题
  • Every application has its own custom binary file format - 仅适用于 (a) Redmond (b) 嵌入式/游戏编程;我可以建议 Boost.Serialization 作为一个好的起点吗?
  • +1 表示 boost:: 序列化。我使用它并且效果很好(而且它也很快)。作为奖励,您可以获得(如果需要)XML 序列化,这对于调试和跨架构兼容性非常有用。结合 boost::streams,可以透明地压缩输出。
  • 您可以尝试找到满足您要求的现有文件格式。您可能还会找到一个库来读取/写入那种数据,或者找到一个实用程序来操作这种格式的数据。如果没有必要,不要重新发明轮子。

标签: c++ serialization layout


【解决方案1】:

我最喜欢的关于文件格式主题的文章是http://www.fadden.com/techmisc/file-formats.htm

除此之外,它可能归结为您要存储什么样的数据,以及这些数据将如何使用(主要是通过网络传输吗?寻求访问有多重要?等等...)。

从那篇文章开始;如果您已经有了需要设计的格式,它可能会帮助您具体化您的想法。

【讨论】:

    【解决方案2】:

    简而言之 - 如果您只需要序列化,这意味着您将从流中读取和写入流,那么您可以在这里不费吹灰之力地使用并逐个成员发出您的 scructs 成员,或者使用任何序列化库, 来自CArchive to .... 随你喜欢。

    如果不是,并且您需要直接访问文件中的数据,那么...您将使用您的要求,他们会通过一些技巧告诉您文件的布局是什么有。

    是的,这里有一个广泛的话题。例如,

    我需要一个用于我的软件的缩略图数据库。每个缩略图都有一个时间戳,我知道它们的大小会不同。要求是:

    • 顺序写入(拇指将附加到数据库的末尾)
    • 拇指将按升序添加
    • 直接读取(给定时间,在 o(1) 中获取缩略图)
    • 以后不再修改数据库
    • 缩略图将以 15 秒为间隔

    是的,这里的要求很简单,但它们代表自己。

    我创建了两个文件,一个带有索引,另一个带有图片。

    存储:将数据文件附加到图像,将索引文件附加到数据文件中图像的索引。 阅读:使用简单索引查找文件中的索引(索引为(timestamp-timestamp_start)/15)。使用该索引来获取图像数据。

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多