
No.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);
}
}
回答ありがとうございます。
見よう見まねでクラスを作って試してみたら結構簡単に出来ました。
こちらの方がややこしくなくていいですね。しかも想定外のC#での初自作クラスも経験できたのでよかったです。
でもMSDNは初心者にはとっつきにくいです。でももっとよく調べるよう心がけます。
どうもありがとうございました。
この質問はこれで打ち切りにいたします。
回答してくださった両名の方々ありがとうございました。
No.2
- 回答日時:
メモリを一括で読み込んでマッピングでできたほうが簡単そうには見えますけども。
BinaryReaderで、構造体に素直に読み込むのがいいのでは?
こんにちは、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;
}
こんな漠然とした質問に回答ありがとうございます。
やりたかったのは、まさにこの通りです。
以下のような感じで出来ることを確認できました。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でのWNetAddConnection3の使...
-
C# DataGridView列カスタマイズ
-
C#で別のFormへ複数の値を返そ...
-
C# visibleプロパティをfalseに...
-
JSPファイルから、ActionFormの...
-
パスがとおらない・・・
-
ORA-01858: 数値を指定する箇所...
-
C言語のポインターに関する警告
-
0dの意味を教えてください
-
オブジェクトの中のプロパティ...
-
ダブルクォーテーションを含む...
-
JSPやサーブレットでSystem.out...
-
System.err. printlnとSystem.o...
-
csv出力について
-
ダブルクォーテーションのrepla...
-
nullcline
-
Formの値が変更されたかどうか...
-
tomcatのstdout.logを停止したい。
-
文字コード変換
-
IF関数でEmpty値を設定する方法。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
Junitテストでvoid戻り値メッソ...
-
C#でキーイベントが発生しない...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
C#から、C++で作成したdll内の...
-
C# WinForm のDataGridView Cel...
-
C#でのWNetAddConnection3の使...
-
C# 親フォームで指定した値を...
-
C# 矢印キーの取得
-
unityでのC++エラーの原因がわ...
-
C# DataGridView列カスタマイズ
-
コンボボックスを使う時の警告
-
C#で、定数をフラグ(if文)に...
-
C# MouseHoverを何度も呼ぶには
-
C#で別のFormへ複数の値を返そ...
-
正規表現
-
【Java】画像表示が出来ない!
-
C# visibleプロパティをfalseに...
-
JavaのSwingで別のフォーム...
おすすめ情報