生のバッファとして受信したカスタム プロトコル データを解析するための C# クラスをモデル化するつもりです。バッファはすでにバイト配列として手元にあります。
このパーサーはさまざまなフィールド レイアウトに対処する必要があるため、プロトコル要素の一部は IntPtrs です。
raw バッファーを構造体にマップした後、構造体内のポインターにアクセスしようとすると、アクセス違反が発生します。
重要な部分を示す簡単な例を作成しました。
namespace CS_StructMarshalling
{
class Packet
{
public PacketStruct Fields;
[StructLayout(LayoutKind.Explicit)]
public struct PacketStruct
{
[FieldOffset(0)] public UInt16 Flags;
[FieldOffset(2)] public IntPtr Data;
}
public Packet()
{
Fields = new PacketStruct();
}
public void DecompileBinaryBuffer(ref Byte[] byteBuffer)
{
int size = Marshal.SizeOf(typeof(PacketStruct));
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(byteBuffer, 0, ptr, size);
this.Fields = (PacketStruct)Marshal.PtrToStructure(ptr, typeof(PacketStruct));
Marshal.FreeHGlobal(ptr);
}
}
class Program
{
static void Main(string[] args)
{
byte[] rawBuffer = new byte[] { 1, 2, 65, 66, 67, 68, 69, 70 };
Packet testPkt = new Packet();
testPkt.DecompileBinaryBuffer(ref rawBuffer);
UInt16 testFlags = testPkt.Fields.Flags;
String testData = Marshal.PtrToStringAnsi(testPkt.Fields.Data, 6);
}
}
}
私はこの問題に頭を悩ませようとしていますが、役に立ちません。私の理解では、IntPtr は個別にマーシャリングする必要がありますが、これをクリーンな方法で行う方法のヒントは見つかりません。
どんなポインタも歓迎します。お時間をいただきありがとうございます。