gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:53:46 24 4
gpt4 key购买 nike

因为我必须经常处理二进制文件,所以我希望有一种更抽象的方法来做到这一点,我必须一遍又一遍地执行相同的循环:

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

现在我想用小的构建 block 来分解这个问题,想象一下如果我可以写一些像 DTD 对 XML 的定义,一个给定 block 之后或给定语义内可能有什么的定义,所以我可以根据构建 block 而不是十六进制值或类似的东西来考虑我的文件,而且代码将更加“惯用”并且不那么神秘。

最后,语言中有什么东西可以帮助我处理二进制文件吗?

最佳答案

我不确定 C++11 的特定功能,但对于一般的 C++,流使文件 I/O 更容易使用。您可以重载流插入 (<<) 和流提取 (>>) 运算符来实现您的目标。如果您对运算符重载不是很熟悉,请参阅 this site 的第 9 章,这很好地解释了它,还有许多例子。这是特别的 page用于在流上下文中重载 << 和 >> 运算符。

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

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

然后,您可以在 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 类设置运算符重载,将它们的数据转换为适当的二进制表示形式。

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

希望这对您有所帮助。

关于c++ - 在 C++ 11 中定义二进制文件的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17646142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com