2017-11-21 19 views
0

新しいバイト配列を作成して、構造体をバイト配列に変換する方法の例がたくさんあります。既存のバイト配列に構造体を書き込む方法は?

しかし、私はこれを避けようとしています。私はバイト[1024]のメッセージバッファーを持っていますし、インデックス1からこのバイト配列に自分の構造体を書きたいと思います。インデックス0はヘッダーなので、私はそれをスキップします。

この例は、新しいバイト配列を作成せずに実行できません。これも可能ですか?

public static byte[] GetBytes<T>(T data) 
    { 
     int size = Marshal.SizeOf(data); 
     byte[] arr = new byte[size]; 
     IntPtr ptr = Marshal.AllocHGlobal(size); 

     Marshal.StructureToPtr(data, ptr, true); 
     Marshal.Copy(ptr, arr, 0, size); 
     Marshal.FreeHGlobal(ptr); 

     return arr; 
    } 

これに伴う問題は、その私は以降、インデックス1にそれを適用する必要がインデックス0で新しい配列上のオブジェクトを書いている:私は現在、バイト配列にオブジェクトを変換する方法

。インデックス0はstructのサイズをバイトで指定します。一例として、既存のコードを使用して

+0

あなたがしたい場合新しいバイト配列を作成するのではなく、既存のバイト配列を使用して、既存のバイト配列を渡して使用します。あなたはそれを使ってどんな問題を抱えていますか? – Servy

+0

どのシリアル化APIを使用していますか?どの例?任意の構造体をバイト配列に変換する標準的な方法はありません。そのため、より多くの情報や具体的な例で質問を制約しない限り、答えは完全に上書きされる可能性があります。 –

+0

新しいバイト配列の作成に使用しているコードを表示してください。 –

答えて

2

は、1位の既存のアレイにあなたの構造体のバイトをコピーするために、ちょうどMarshal.Copyに既存のアレイと1の開始位置を渡します。

byte[] existingArray = new byte[1024];  // This is your existing 1024 size byte array 

int size = Marshal.SizeOf(data); 
IntPtr ptr = Marshal.AllocHGlobal(size); 

Marshal.StructureToPtr(data, ptr, true); 
Marshal.Copy(ptr, existingArray, 1, size); // Pass your array and start at position 1 
Marshal.FreeHGlobal(ptr);] 
関連する問題