1

バイナリ ファイルに保存したい、float のベクトルのベクトルとして表される 3D ボリュームがあります。(これは、CT スキャナーからの X 線画像から再構成された密度ボリュームです。)

今、私は次の方法でこれを行うことができます:

        //iterate through the volume
        for (int x = 0; x < _xSize; ++x){
            for (int y = 0; y < _ySize; ++y){
                for (int z = 0; z < _zSize; ++z){
                    //save one float of data
                    stream.write((char*)&_volume[x][y][z], sizeof(float));
                }
            }
        }

これは基本的に機能します。ただし、これがどの程度プラットフォームに依存しないかを自問しています。作成されたシステムに関係なく、同一のファイルを作成したいと思います。そのため、Windows、Linux、または Mac を実行しているマシンがあり、それらのワード長は 32 ビットまたは 64 ビットで、バイト順はリトル エンディアンまたはビッグ エンディアンです。

私がこれを上記の方法で行った場合、これは当てはまらないと思います。どうすればこれを達成できますか?シリアル化について聞いたことがありますが、このインスタンスの具体的な解決策は見つかりませんでした。

4

3 に答える 3

2

QtDatastreamクラスを使用して問題を解決しました。とにかく Qt は私のプロジェクトの一部なので、追加の作業は最小限です。単精度 (32 ビット) または倍精度 (64 ビット) を使用Datastreamして保存するか、リトル エンディアンまたはビッグ エンディアンのバイト順を使用するかをオブジェクトに正確に伝えることができます。floatsこれで十分です。オブジェクトをシリアル化する必要はありません。保存するファイルは、すべてのプラットフォームでまったく同じ形式になりました (少なくともそうあるべきです)。必要なのはこれだけです。その後、これらの情報 (バイト順、精度) が提供されるサードパーティのアプリケーションによって読み取られます。つまり、フロートがどのように保存されるかは重要ではありませんが、知っていることは言うまでもありませんそれらがどのように保存され、プログラムを実行するプラットフォームに関係なく、これが一貫していること。

コードは次のようになります。

QDataStream out(&file);
out.setFloatingPointPrecision(QDataStream::SinglePrecision);
out.setByteOrder(QDataStream::LittleEndian);

for (int x = 0; x < _xSize; ++x){
    for (int y = 0; y < _ySize; ++y){
        for (int z = 0; z < _zSize; ++z){
            //save one float of data
            out<<_volume[x][y][z];
        }
    }
}
于 2015-05-03T15:45:30.970 に答える
2

Google Protocol Buffers: 無料、バイナリにエンコード、複数の言語で利用可能、ほとんどのプラットフォームでも動作します。あなたの要件のために、GPBを真剣に検討します。ただし、Google はいくつかのバージョンをリリースしており、常に下位互換性があるとは限りません。つまり、古いデータが新しいバージョンの GPB コードで読み取れるとは限りません。それはまだ進化しており、さらに変化が起こると感じています。プロジェクトが何年にもわたって進化する場合、これは厄介なことになる可能性があります。

ASN.1、それらすべての祖父、非常に優れたスキーマ言語 (値とサイズの制約を設定できます。これは、バッファ オーバーランを回避する素晴らしい方法であり、自動生成されたコードが正しい場合にデータ ストリームの自動検証を提供します)、いくつかの無料ツール、このページを参照してください(ほとんどの場合、お金がかかりますが)。GPB のスキーマ言語は、ASN.1 のものを模倣したものではありません。

于 2015-05-01T06:29:01.453 に答える