- ベストアンサー
C# バイナリダンプを構造体に簡単に入れる方法
C#初心者です。 バイナリファイルをダンプしてイメージヘッダ等を構造体に入れて 各フィールド単位で操作したいのですが、最も簡単な方法はありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
MSDNに目を通しましょう。 全部書いてありますよ。 C#を2、3年ほど書いてないのでなんとなくです。 public class BITMAPFILEHEADER { public ushort bfType; public uint bfSize; public ushort bfReserved1; public ushort bfReserved2; public uint bfOffBits; public void Read(BinaryReader b) { bfType = b.ReadUInt16(); bfSize = b.ReadUInt32(); bfReserved1 = b.ReadUInt16(); bfReserved2 = b.ReadUInt16(); bfOffBits = b.ReadUInt32(); }; public void Write(BinaryWriter b) { b.Write(bfType); b.Write(bfSize); b.Write(bfReserved1); b.Write(bfReserved2); b.Write(bfOffBits); } }
その他の回答 (2)
- takoashi
- ベストアンサー率39% (21/53)
メモリを一括で読み込んでマッピングでできたほうが簡単そうには見えますけども。 BinaryReaderで、構造体に素直に読み込むのがいいのでは?
お礼
こんにちは、BinaryReader を調べたのですが、VBのサンプルしか出てこなかったのでうまくイメージできません。 この方法だとunsafeでなくもっと簡単に出来るのでしょうか?
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 C言語等に良く有る、構造体のポインタに向かってfread()する様な感じと言う事でしょうか。 以下のURLに、配列や構造体をポインタにキャストしてコピーしているコード等が色々と記載されています。 http://d.hatena.ne.jp/Schima/20090512/1242139542 上記を参考に、以下を試してみましたが、ちゃんと出来る様です。ソリューションの設定にある「アンセーフコードの許可」にチェックを入れて下さい。 //19バイトの構造体 [StructLayout(LayoutKind.Sequential, Pack=1)] public struct PERSON { unsafe public fixed byte pszName[16];//名前 public byte fAge;//年齢 public ushort wAddress;//住所番号 } private void Form1_Load(object sender, EventArgs e) { //バイナリファイルオープン System.IO.FileStream fileStream = new System.IO.FileStream("test.bin", System.IO.FileMode.Open); int fileSize = (int)fileStream.Length; //ファイルからバッファにデータを吸い上げる byte[] buffer = new byte[fileSize]; fileStream.Read(buffer, 0, fileSize); //バッファから構造体に向かってメモリコピー PERSON person = new PERSON(); unsafe { Marshal.Copy(buffer, 0, new IntPtr(&person), fileSize); } fileStream = null; }
お礼
こんな漠然とした質問に回答ありがとうございます。 やりたかったのは、まさにこの通りです。 以下のような感じで出来ることを確認できました。 public struct sImageHeader { // 全部で20byte unsafe public fixed byte Machine[2]; unsafe public fixed byte NumberOfSections[2]; unsafe public fixed byte TimeDateStamp[4]; ... 略 } byte[] buffer = new byte[20]; fileStream.Read(buffer, 0, 20); sImageHeader sih = new sImageHeader(); unsafe { Marshal.Copy(buffer, 0, new IntPtr(&sih), 20); } 構造体のメンバをstring型に入れなおそうとすると、unsafe領域でないと駄目みたいなことを言われました。 unsafe ということで色々制約があるようですね、もっと勉強します。 どうもありがとうございました。
お礼
回答ありがとうございます。 見よう見まねでクラスを作って試してみたら結構簡単に出来ました。 こちらの方がややこしくなくていいですね。しかも想定外のC#での初自作クラスも経験できたのでよかったです。 でもMSDNは初心者にはとっつきにくいです。でももっとよく調べるよう心がけます。 どうもありがとうございました。 この質問はこれで打ち切りにいたします。 回答してくださった両名の方々ありがとうございました。