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

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

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

Re[3]: 構造体をバイト配列で取り出す方法


(過去ログ 13 を表示中)

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

■4102 / inTopicNo.1)  構造体をバイト配列で取り出す方法
  
□投稿者/ もんすけ (3回)-(2007/06/06(Wed) 15:26:09)

分類:[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!!");
}
}
}
}

どのようにすれば実現できるのかご教授下さい。
よろしくお願いします。

引用返信 編集キー/
■4104 / inTopicNo.2)  Re[1]: 構造体をバイト配列で取り出す方法
□投稿者/ Hongliang (144回)-(2007/06/06(Wed) 15:53:31)
Hongliang さんの Web サイト
まず、何のためにそうしなければならないのかをはっきりさせる必要があります。
それによって解も変わってきますから。

取り敢えず、「C/C++ と同じようにコーディングしたいから」なら、「他の言語の流儀を持ち込んじゃ駄目」ですが。
引用返信 編集キー/
■4125 / inTopicNo.3)  Re[2]: 構造体をバイト配列で取り出す方法
□投稿者/ もんすけ (5回)-(2007/06/07(Thu) 10:30:29)
No4104 (Hongliang さん) に返信
> まず、何のためにそうしなければならないのかをはっきりさせる必要があります。
> それによって解も変わってきますから。
>
> 取り敢えず、「C/C++ と同じようにコーディングしたいから」なら、「他の言語の流儀を持ち込んじゃ駄目」ですが。

C++で作成されたDLLとのインターフェイスに構造体が必要なのですが、C#で作られたクラスへのインターフェイスではバイト配列にして渡す必要があり、共用体のような扱いができればと思ったのですが・・・

とりあえず、メンバを順番に配列にセットしていく方法で対応致します。

どうも、ご回答ありがとうございました。
解決済み
引用返信 編集キー/
■4203 / inTopicNo.4)  Re[3]: 構造体をバイト配列で取り出す方法
□投稿者/ とおりすがり (2回)-(2007/06/09(Sat) 12:23:59)
構造体のインスタンスをシリアル化すればできるとおもいます。
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -