繁体   English   中英

在C ++ 11中定义二进制文件的结构

[英]Defining the structure of a binary file in C++ 11

由于我必须使用二进制文件很多,我想有一个更抽象的方法来做到这一点,我必须一遍又一遍地执行相同的循环:

  • 写一个标题
  • 以给定的顺序写出不同类型的块(具有不同的值集)
  • 写一个可选的结束标题

现在我想在小构建块中解决这个问题,想象一下,如果我可以编写类似DTD对于XML的内容,定义在给定块之后或在给定语义之内可能存在的内容,所以我可以考虑我的文件构建块而不是十六进制值或类似的东西,代码将更加“惯用”,而不是神秘。

最后,语言中的某些内容可以帮助我从这个预期的二进制文件?

我不确定C ++ 11的具体功能,但对于C ++,一般来说,流使文件I / O更容易使用。 您可以重载流插入(<<)和流提取(>>)运算符以实现您的目标。 如果你不熟悉运算符重载, 本网站的第9章,它解释得很好,还有很多例子。 这是在流的上下文中重载<<和>>运算符的特定页面

请允许我说明一下我的意思。 假设我们定义了几个类:

  1. BinaryFileStream - 表示您尝试写入和(可能)读取的文件。
  2. BinaryFileStreamHeader - 表示文件头。
  3. BinaryFileStreamChunk - 代表一个块。
  4. BinaryFileStreamClosingHeader - 表示结束标头。

然后,您可以重载BinaryFileStream中的流插入和提取操作符来写入和读取文件(或任何其他istream或ostream)。

...
#include <iostream> // I/O stream definitions, you can specify your overloads for
                    // ifstream and ofstream, but doing so for istream and ostream is
                    // more general

#include <vector>   // For holding the chunks

class BinaryFileStream
{
public:
...
    // Write binary stream
    friend const std::ostream& operator<<( std::ostream& os, const BinaryFileStream& bfs )
    {
         // Write header
         os << bfs.mHeader;

         // write chunks
         std::vector<BinaryFileStreamChunk>::iterator it;
         for( it = bfs.mChunks.begin(); it != bfs.mChunks.end(); ++it )
         {
             os << (*it);
         }

         // Write Closing Header
         os << bfs.mClosingHeader;

         return os;
    }
...
private:
    BinaryFileStreamHeader             mHeader;
    std::vector<BinaryFileStreamChunk> mChunks;
    BinaryFileStreamClosingHeader      mClosingHeader;
};    

所有你必须做的就是为BinaryFileStreamHeader,BinaryFileStreamChunk和BinaryFileStreamClosingHeader类提供运算符重载,这些类将数据转换为适当的二进制表示。

您可以以类似的方式重载流提取运算符(>>),但解析可能需要一些额外的工作。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM