|
分類:[C# (Windows)]
環境:WindowsXP Pro 言語:Microsoft Visual C# 2005
以下のようなCの構造体があるとします。
typedef struct ST_A { unsigned short a; unsigned char b[2]; unsigned char c; }
typedef struct ST_B { unsigned short aa; unsigned char bb[2]; ST_A sta[10]; }
ST_B stb;
この stb の内容をバイト配列として取り出すには、
typedef union UNI_C { unsigned char a[4 + (5*10)]; ST_B stb; }
UNI_C unic;
unic.a[0],unic.a[1]・・・・
で実現できますが、同じことを C# で実現するにはどうすればよいでしょうか?
以下のようにコーディングしてみましたがうまくいきません。
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;
namespace CStest { unsafe class Program { [StructLayout(LayoutKind.Sequential)] public struct ST_A { public ushort a; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] b; public byte c; }
[StructLayout(LayoutKind.Sequential)] public struct ST_B { public ushort aa; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] bb; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public ST_A[] sta; }
[StructLayout(LayoutKind.Explicit)] public struct ST_C { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4 + (5 * 10))] [FieldOffset(0)] public byte[] aaa; [FieldOffset(0)] public ST_B stb; } static void Main(string[] args) { ST_C stc = new ST_C(); //マーシャリング stc.stb.bb = new byte[2]; stc.stb.sta = new ST_A[10]; for(int i = 0; i > 10; i++) { stc.stb.sta[i].b = new byte[2]; } stc.aaa = new byte[4 + (5*10)];
stc.stb.sta[0].a = 0x12; stc.stb.sta[0].c = 0x34; if (stc.aaa[8] == 0x34) { Console.Write("OK!!"); } else { Console.Write("ERROR!!"); } } } }
どのようにすれば実現できるのかご教授下さい。 よろしくお願いします。
|