C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

構造体をbyte配列に変換

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■83645 / inTopicNo.1)  構造体をbyte配列に変換
  
□投稿者/ はちみつ (2回)-(2017/03/31(Fri) 20:10:44)

分類:[C#] 

Windows7 Home 32bit

メモリマップドファイルの中に入っている構造体のデータを書き換えたいと思います。

このような構造体を作りまして

struct sample()
{
public bool flagA;
public bool flagB;
}

Marshal.StructureToPtrを使って構造体の先頭アドレスを参照してデータを書き換えました。
しかし、flagAをtrueにすることはできるのですが、flagBはtrueになることがありませんでした。

調べてみると、メモリマップドファイルのデータをプロパティで直接flagAとflagBが共にtrueにした時、
メモリマップドファイル先のバイト配列データは
[1,1,0,0,0,0,0,0] だったのですが、

Marshal.StructureToPtr(構造体データ,構造体の先頭アドレス,false)でポインタから書き換えたときは
[1,0,0,0,1,0,0,0] でした。

後者のデータを前者のようなデータにしたい場合はどうすればよいのでしょうか。
引用返信 編集キー/
■83650 / inTopicNo.2)  Re[1]: 構造体をbyte配列に変換
□投稿者/ Hongliang (522回)-(2017/03/31(Fri) 21:19:10)
既定のマーシャラは、bool型を4バイト整数として変換します。これはWinAPIで多用されるBOOL型が4バイト整数で扱われるのと整合性を取るためでしょう。
他の長さの整数として扱うのであれば、フィールドにMarshalAs属性を付け、UnmanagedTypeでU1などを指定します。
引用返信 編集キー/
■83656 / inTopicNo.3)  Re[2]: 構造体をbyte配列に変換
□投稿者/ はちみつ (3回)-(2017/03/31(Fri) 22:26:47)
No83650 (Hongliang さん) に返信
> 既定のマーシャラは、bool型を4バイト整数として変換します。これはWinAPIで多用されるBOOL型が4バイト整数で扱われるのと整合性を取るためでしょう。
> 他の長さの整数として扱うのであれば、フィールドにMarshalAs属性を付け、UnmanagedTypeでU1などを指定します。

回答ありがとうございます。
なるほど、マーシャルを使うと中身も変わってくるのですね。
マーシャルではなく、メンバ内のデータを個別にサイズを測ってbyte配列に入れる方法も考えてみます。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ