プロが教える店舗&オフィスのセキュリティ対策術

C#初心者です。

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

A 回答 (3件)

MSDNに目を通しましょう。


全部書いてありますよ。


C#を2、3年ほど書いてないのでなんとなくです。


public class BITMAPFILEHEADER
{
public ushortbfType;
public uintbfSize;
public ushortbfReserved1;
public ushortbfReserved2;
public uintbfOffBits;

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);
}
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
見よう見まねでクラスを作って試してみたら結構簡単に出来ました。
こちらの方がややこしくなくていいですね。しかも想定外のC#での初自作クラスも経験できたのでよかったです。

でもMSDNは初心者にはとっつきにくいです。でももっとよく調べるよう心がけます。
どうもありがとうございました。
この質問はこれで打ち切りにいたします。
回答してくださった両名の方々ありがとうございました。

お礼日時:2009/05/28 22:57

メモリを一括で読み込んでマッピングでできたほうが簡単そうには見えますけども。


BinaryReaderで、構造体に素直に読み込むのがいいのでは?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/27 20:48

 こんにちは。


 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;
}
    • good
    • 0
この回答へのお礼

こんな漠然とした質問に回答ありがとうございます。
やりたかったのは、まさにこの通りです。

以下のような感じで出来ることを確認できました。

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 ということで色々制約があるようですね、もっと勉強します。

どうもありがとうございました。

お礼日時:2009/05/27 20:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!