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で質問しましょう!
似たような質問が見つかりました
- Android AndroidミラーリングでPCからAndroidを操作するには 4 2022/06/17 11:16
- 統計学 ガチャガチャの中に、あるアニメの キャラAのフィギュアが3種類1個ずつ キャラBのフィギュアが3種類 1 2022/06/04 15:28
- Excel(エクセル) 非表示にしたい行をグループ化して折り畳み 4 2022/09/17 20:17
- カップル・彼氏・彼女 初体験の元彼女がずっと胸のサイズもありスポブラだったのですが、新しくできた彼女はサイズもなかなかある 6 2023/08/27 01:35
- その他(悩み相談・人生相談) 私のお友達のことで相談があるの♪ フォークリフトの免許って誰でも簡単にとれるのかしら?操作方法って簡 4 2023/04/22 17:35
- YouTube 棒読みアプリ 2 2022/08/28 18:29
- Word(ワード) ウェブページの変換について 4 2022/03/31 21:36
- 会計ソフト・業務用ソフト Googleドキュメントで数式を書くには 2 2022/07/20 09:06
- 芸術学 音高を示す単位量であるセント (cent) が作られた理由として適切なものは? A.音階がオクターブ 3 2022/04/21 13:17
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Junitテストでvoid戻り値メッソ...
-
Java ボールが動くアニメーション
-
C# タスク非表示でタイトルバー...
-
struts2のchainで値の受け渡し...
-
Processingでマウスクリックで...
-
デスクトップマスコットのドラ...
-
JWindow、JFrameでモーダル化の...
-
ペイントソフトを作っているの...
-
VBAで配列の計算
-
配列にnullを代入すると、null...
-
ループ処理の際、最後だけ","を...
-
配列をセッションに割り当てた後で
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
-
シャットダウンフックが呼ばれない
-
EXCEL VBA で、0から?1から?
-
テキストボックスに入力された...
-
べき乗
-
グレイコードの変換
-
C# ListBoxのインデックスの値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# 矢印キーの取得
-
Thread.sleepのInterruptedExce...
-
unityでのC++エラーの原因がわ...
-
C#で別のFormへ複数の値を返そ...
-
C# visibleプロパティをfalseに...
-
エンターキーを押すとOKボタン...
-
Processingでマウスクリックで...
-
[C#.net]スレッド化された別フ...
-
C#でキーイベントが発生しない...
-
C# DataGridView列カスタマイズ
-
【C#】ソースコードをファイル...
-
LVM_SETITEMSTATEでListViewの...
-
GetDIBits関数の使い方について
-
未割り当てのローカル変数
-
C# MouseHoverを何度も呼ぶには
おすすめ情報