1

私はバイナリ形式のファイルを頻繁に操作する必要があるため、それを行うためのより抽象的な方法が必要です。同じループを何度も実行する必要があります。

  • ヘッダーを書く
  • 与えられた順序で異なる種類のチャンク (異なる値のセットを持つ) を書き込みます
  • オプションの終了ヘッダーを書く

ここで、この問題を小さなビルディング ブロックに分割したいと思います。XML の DTD とは何か、特定のチャンクの後または特定のセマンティック内に何があり得るかの定義のようなものを書くことができれば想像してみてください。 16 進値などではなく、ビルディング ブロックの観点からファイルを考えてください。また、コードははるかに「慣用的」で、暗号化されていません。

最後に、この見込み客からのバイナリファイルで私を助けることができる言語に何かがありますか?

4

1 に答える 1

3

C++11 固有の機能についてはよくわかりませんが、一般的に C++ では、ストリームによってファイル I/O の操作がはるかに簡単になります。目的を達成するために、ストリーム挿入 (<<) およびストリーム抽出 (>>) 演算子をオーバーロードできます。演算子のオーバーロードについてあまり詳しくない場合は、このサイトの第 9 章で、多数の例とともに詳しく説明されています。これは、ストリームのコンテキストで << および >> 演算子をオーバーロードするための特定のページです。

私の言いたいことを説明させてください。いくつかのクラスを定義するとします:

  1. BinaryFileStream - 書き込みおよび (おそらく) 読み取りを行おうとしているファイルを表します。
  2. BinaryFileStreamHeader - ファイル ヘッダーを表します。
  3. BinaryFileStreamChunk - 1 つのチャンクを表します。
  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 クラスの演算子のオーバーロードを用意することだけです。

同様の方法でストリーム抽出演算子 (>>) をオーバーロードできますが、解析には追加の作業が必要になる場合があります。

お役に立てれば。

于 2013-07-15T04:18:53.537 に答える