C#.NETバージョン2でバイトの配列を構造に直接取得する方法を教えてもらえますか?Cで見られるようなおなじみのfread
ように、これまでのところ、バイトのストリームを読み取って構造体を自動的に埋めることはあまり成功していません。キーワードを使用してマネージコードにポインターhocus-pocusがある実装を見てきましたunsafe
。
このサンプルを見てください:
public unsafe struct foobarStruct{
/* fields here... */
public foobarStruct(int nFakeArgs){
/* Initialize the fields... */
}
public foobarStruct(byte[] data) : this(0) {
unsafe {
GCHandle hByteData = GCHandle.Alloc(data, GCHandleType.Pinned);
IntPtr pByteData = hByteData.AddrOfPinnedObject();
this = (foobarStruct)Marshal.PtrToStructure(pByteData, this.GetType());
hByteData.Free();
}
}
}
私が2つのコンストラクターを持っている理由foobarStruct
- 空のコンストラクターは存在できませんか?
- 構造体をインスタンス化するときに、メモリのブロックを(バイト配列として)コンストラクターに渡します。
その実装は十分に良いですか、それともこれを達成するためのはるかにクリーンな方法がありますか?
編集: ISerializableインターフェースまたはその実装を使用したくありません。使用されているフィールドを計算し、PE構造を使用してそのデータを決定するために、バイナリイメージを読み取ろうとしています。