2009-07-21 13 views
0

Related Question構造体に配列のバイト配列をマーシャリングするにはどうすればよいですか?

私は最も速い方法を見つけようとしていました。その質問で私が選んだ方法は、私にとってはボトルネックになっています。私はファイルからいくつかのバイナリデータを読み込み、それを管理された構造体定義に入れる必要があります。管理されていないコードは関係していないので、GCHandleを割り当てるよりも良い方法があると思います。

バイトの配列を同じサイズの構造体にキャストする方法はありますか?

static public T ReadStructure<T>(byte[] bytes) 
    where T : struct 
{ 
    int len = Marshal.SizeOf(typeof(T)); 
    IntPtr i = Marshal.AllocHGlobal(len); 

    try 
    { 
     Marshal.Copy(bytes, 0, i, len); 
     return (T)Marshal.PtrToStructure(i, typeof(T)); 
    } 
    finally 
    { 
     Marshal.FreeHGlobal(i); 
    } 
} 

確かに、それは非常に高速ではありません - それは私の場合には、する必要はありません。

答えて

0

は、私はこのような方法があります。これはあなたの現在の解決策ですか、あなたはalloc/copy/releaseのオーバーヘッドが遅すぎるのを発見していますか?

+0

これを試すことがあります。問題は、私は254バイトを読み、最初の240が型を含んでいるかどうかを確認しなければならないことです。この方法では、ファイルからデータを読み込み、最初の240バイトをptrにコピーしてチェックし、254全体をptrにコピーします。たくさんのコピーが起こっています。 – scottm

+0

最適化のための2つの道があるような音がします。いくつかのコードを投稿できますか? –

+0

@Ben、関連する質問には、私が現在やっていることの例があります。 – scottm

0

あなたは、このようなコードをチェックアウトすることができます:


struct Foo 
{ 
    public int x; 
} 

public unsafe static void Main() 
{ 
    byte[] x = new byte[] { 1, 1, 0, 0 }; 
    Foo f; 

    fixed (byte* xPtr = x) 
    { 
    f = *((Fpp*)xPtr); 
    } 

    Console.WriteLine(f.x); 
} 

それは間違いだ非常に危険な、構造がいくつかのより複雑なタイプが含まれている場合、あなたが問題を抱えている可能性があり、広告。

+0

32/64bit境界でこのメソッドを使用することの意義は何ですか?この方法でデータを共有して共有する可能性のあるすべてのマシンで、まったく同じような表現を保証する方法はありますか? –

+0

Fppとは何ですか?自分のタイプを使って同様の宣言をしようとすると、「アドレスを取得できない、サイズを取得する、または管理型にポインタを宣言できない」というメッセージが表示されます。 – scottm

+0

FppではなくFooを書くと思います。 –

関連する問題