質問
1つのストリームからいくつかのデータを複数のオブジェクトに逆シリアル化する必要があるアプリケーションがあります。
Data配列は、可変長のメッセージの数をまとめて表します。ストリームにはメッセージを区切るコードはありません。
次のようなことをしたい:
void Decode(byte[] Data)
{
Object0.ExtractMessage(Data);
Object1.ExtractMessage(Data);
Object2.ExtractMessage(Data);
...
}
各ProcessData呼び出しは、配列のどこから開始するかを知っています。理想的には、 DataIx
参照を渡さずにこれを行います。
C ++でこれを行うには、配列にポインターを渡すだけで、各ProcessData関数は必要に応じてインクリメントします。
各オブジェクトクラスは、自身のメッセージがどのようにシリアル化されるかを知っており、ストリーム内の次のメッセージの先頭でポインターを返すために(C ++で)信頼できます。
これを行うために使用できる組み込みのメカニズムはありますか(安全ではない
になります)?動作は高周波(〜10kps)で非常に軽量です。また、配列のコピーやトリミングを行いたくありません。
ご協力ありがとうございます。
解決
配列インデックスを渡して返すだけではありませんか?基本的には、ポインタが固定されたメモリ位置からのオフセットであるということです。
他のヒント
これは、単純なストリームが必要なように聞こえます(たとえば、MemoryStreamをバイト配列のラッパーとして使用します: stream = new MemoryStream(data))。
バイト配列をストリームにラップして、すべてのオブジェクトは、必要なだけストリームから読み取り、ストリームを次のアイテムに渡します。バイト配列全体を一度にロードする必要がないという利点もあります。
それ以外は、C ++で行ったのとまったく同じようにC#でポインターを使用できます(ただし、ポインターには安全でないキーワードが必要であり、推奨されていません)
別の方法として、データとインデックス変数を渡してからインデックスをインクリメントすることもできます(これは、実際にはポインタを使用するのと同じですが、安全である必要はありません)。
MemoryStreamでデータをラップしてから、StreamReaderをExtractMessageメソッドに渡す方法はどうですか?
いくつかのことが思い浮かぶと思います。
また、配列オフセットを維持するクラスでbyte []をラップすることにより、ポインターの動作をシミュレートできます。配列にアクセスするときはいつでも、おそらく次のバイトを返し、オフセット変数もインクリメントするアクセサメソッドを介して、クラスからアクセスします。クラスインスタンスは、異なるExtractMessage関数呼び出し間で渡すことができます。
C ++ / CLIの使用はどうですか?これにより、使い慣れたC / C ++テクニックを使用でき、しかも相互運用機能を使用せずにC#から直接呼び出すことができます。
もちろん、恐ろしい安全でないオプションがあります。これにより、byte []へのC#ポインターを取得し、必要なポインター演算を実行します。
バイト配列から stream
を作成できます。
Stream stream = new MemoryStream(data);
その後、プロセッサがストリームで動作する可能性があります。