• ベストアンサー

C# バイナリダンプを構造体に簡単に入れる方法

C#初心者です。 バイナリファイルをダンプしてイメージヘッダ等を構造体に入れて 各フィールド単位で操作したいのですが、最も簡単な方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • takoashi
  • ベストアンサー率39% (21/53)
回答No.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); } }

un0929289
質問者

お礼

回答ありがとうございます。 見よう見まねでクラスを作って試してみたら結構簡単に出来ました。 こちらの方がややこしくなくていいですね。しかも想定外のC#での初自作クラスも経験できたのでよかったです。 でもMSDNは初心者にはとっつきにくいです。でももっとよく調べるよう心がけます。 どうもありがとうございました。 この質問はこれで打ち切りにいたします。 回答してくださった両名の方々ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • takoashi
  • ベストアンサー率39% (21/53)
回答No.2

メモリを一括で読み込んでマッピングでできたほうが簡単そうには見えますけども。 BinaryReaderで、構造体に素直に読み込むのがいいのでは?

un0929289
質問者

お礼

こんにちは、BinaryReader を調べたのですが、VBのサンプルしか出てこなかったのでうまくイメージできません。 この方法だとunsafeでなくもっと簡単に出来るのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

 こんにちは。  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; }

un0929289
質問者

お礼

こんな漠然とした質問に回答ありがとうございます。 やりたかったのは、まさにこの通りです。 以下のような感じで出来ることを確認できました。 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 ということで色々制約があるようですね、もっと勉強します。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 構造体のテンプレートを適用した状態で一覧できるバイナリエディタ

    バイナリのファイルを構造体テンプレートを適用した状態で一覧して、できればテキストファイルに落とせるソフトを探しています。フリーでもシェアでも構いません。 あるフリーのバイナリエディタを使用してみたのですが、構造体テンプレートを適用した状態で見られるのは1レコードずつで、全体を見たり、テキストファイルに変換したりができませんでした。 またそれ以外でも何か良い方法があれば教えてください。 C言語でプログラムを書いてもいいのですが・・・できれば簡単にしてしまいたいので。 よろしくお願いします。

  • 構造体の変数をバイナリモードで書き込んだのですが

    C言語初心者です。 以下の様なプログラムで構造体の変数をバイナリモードで書き込んだのですが #include "stdafx.h" struct TBL { char c; int i; }; int _tmain(int argc, _TCHAR* argv[]) { FILE *fp; TBL sample; sample.c = 'A'; sample.i = 'A'; fp = fopen("sample.dat","wb"); fwrite(&sample,sizeof(TBL),1,fp); fclose (fp); return 0; } できた”sample.dat”をダンプしてみると 41 CC CC CC 41 00 00 00 EOF となり char型のデータも4バイトデータを所有しているのですがどうしてでしょうか。

  • Java バイナリデータの扱い

    既出でないことを確認してみたつもりです。 <やりたいこと> 1.バイナリデータに埋め込まれたデータを読み込みたい。 2.バイナリデータの並びは例えば double d1,d2; char buffer[256]; int i1, i2; などとなっていてファイルヘッダとして同じフォーマットのファイルには全て埋め込まれています。これを読み込みたいです。 <質問> C言語であれば例えば構造体を定義してやって構造体のポインタに対して ヘッダの読み込みを行ってやれば上記のdoubleなどの変数は参照できる ようになりますが、Javaで同等の処理をやろうとするとどうすれば 良いのかわかりません。 良い方法があれば教えて下さい。宜しくお願いします。

    • ベストアンサー
    • Java
  • C++/CLIでネイティブの構造体を使用したい

    すみません。C++の初心者です。 C++/CLIフォームアプリケーションで関数の呼出し画面を作成しています。 既にある(C++ネイティブで作成済み)のヘッダファイルをプロジェクト上にコピー、追加して ヘッダファイル内に書かれている構造体を使用したいのですが、 出来ないのでしょうか? ヘッダファイル(xxx.h)内には以下のような構造体が作成されています。 typedef struct { double pq_base; int iter_max; double eps; int chi_set_flg; int bad_rmv_flg; int obs_slk_flg; int obs_before_flg; int calc_pf_flg; double *chi_val_95_0; double *chi_val_97_5; double *chi_val_99_0; }s_SE_SET; C++/CLIのプロジェクト内にこのヘッダファイルを追加して フォーム内のあるボタンを押された時に、この構造体を参照させてあげたいのですが、 以下の様に構造体変数を定義して s_SE_SET se_set; ビルドを行うと以下のエラーが出ます。 error C4368: 'se_set' をマネージ 'se_project::Form1' のメンバーとして定義できません。 混合型はサポートされていません C++/CLIではネイティブで定義された構造体は使用出来ないのでしょうか? なにか方法が有るとすればその方法を教えて頂けると嬉しいです。 どなたかご教授頂けませんでしょうか。 よろしくお願い致します。

  • バイナリエディタはどう使うの?

    先日配布するために作成した音声ファイルや画像ファイルを全て.datに書き換えました。 しかし計画性無く全て書き換えてしまったので一体どれがどのファイルか わからなくなってしまいました。 そこでバイナリエディタで開いてみたのですが、よくわかりません。 .wavファイルはバイナリエディタのヘッダを見たらwavと書いてあるのでわかるのですが、 何も書いて無いファイルもあります。 そこでちょっとバイナリについて勉強してみようかと思ったのですが そんなバイナリについて詳しく説明してあるサイトとか本とかありますでしょうか。 ヘッダファイルはこんな構造になっているとか。 よければ本やサイトのオススメを教えてください。 よろしくお願いします。

  • 構造体の宣言方法について

    構造体の宣言で ヘッダーファイルに struct RAM rom_AAA[20] を宣言 Cソースファイル(上記のヘッダーファイルをインクルードする)に struct RAM { struct BBB *CCC } を宣言 とした時 rom_AAA[20]と*CCC(BBBアドレス)はリンクしてる状態になるのでしょうか? 構造体の一部の定数テーブルを参照するために 間単にポインタ使ってグルグル回したいのですが、同じものをアクセスしてる事にならないでしょうか?

  • バイナリ→構造体

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1087139 の続きです。仕様の都合でMoveMemoryを使って構造体をファイルマッピングできないため、一度文字列にして…と考えていたんですが、どうも文字列にすると別な問題が出るようなのでLong型のポインタにしたいと思ってます。  何故Longかと言うとこれも仕様の都合なので…Byte配列にとは出来ないんですが…同じ、ですよね?  蛇足が長々と続きましたが、本題は… 1、VarPtrを使ってLong型のポインタに変換(してると思ってます) 2、それを別の構造体に格納、その構造体を共有メモリに移す。 3、別ウインドウから取り出し、最初のLongのポインタを引き抜く 4、Long型ポインタから構造体に戻す  となれば完成で、3までは進めるのですが…最後の4ができません。  ここから再び蛇足ですが、そもそも何故こんな面倒な事を?といいますと、共有メモリを扱うOCXを作る必要がありまして、さらに受け取ったデータをCue構造にしなければならないのです。その辺りを操作してるのが2つ目の構造体です。1と4はOCXを扱う側、2と3はOCX内で行ってます。  出来れば全部OCX内で出来るといいなーとは思ってますが…すいません、本当に蛇足でした。

  • 構造体について

    分割ファイルで構造体を使うにはヘッダファイルに書くと思うのですがどうやって書けばいいのでしょうか? charやintはexternでできるのですが・・・ 例で教えてくださいm(__)m

  • 可変長構造体をファイルから読み込み処理

    可変長の構造体、 typedef struct 構造体(仮) { char c1,c2; float f1,f2; double d; int size; //↓strのサイズ char str[1]; //文字配列 }構造体(仮); の形式で書かれたバイナリデータファイルがあります。 そのファイルを読み込んでcsv形式で出力する処理を、 ファイルからの読み込む回数を減らしてやりたいと思っています。 その方法を教えていただけませんか? よろしくおねがいします。

  • 82 00 00 41で始まるバイナリ

    サイズの大きなバイナリファイルを入手しました。 ダンプすると先頭は 82 00 00 41~ でした。 ダンプの最後は 05 F0があって、そのF0以降はたくさんの00でした。 思い当たるファイルフォーマットはありませんでしょうか?

このQ&Aのポイント
  • PX-M791FTの管理者パスワードの初期値がわからないです。
  • EPSON社製品のPX-M791FTの管理者パスワードの初期値を教えてください。
  • EPSONのPX-M791FTの管理者パスワードの初期値が分かりません。
回答を見る

専門家に質問してみよう