シリアル化された構造体を C# アプリに送信する C++ アプリケーションがあり、C# で作成した新しい構造体にバイトを直接自動的にコピーしたいと考えています。ただし、ネットワーク経由で送信された構造体には 3 バイトのブロックが含まれているようで、これはかなり奇妙に思えます。
C++ 構造体は次のとおりです。
typedef struct ATTQueryAgentStateConfEvent_t {
ATTWorkMode_t workMode; /* enum type */
ATTTalkState_t talkState; /* enum type */
long reasonCode;
ATTWorkMode_t pendingWorkMode; /* enum type */
long pendingReasonCode;
} ATTQueryAgentStateConfEvent_t;
C# で作成した構造体:
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct ATTQueryAgentStateConfEvent_t
{
public ATTWorkMode_t workMode; /* enum type */
public ATTTalkState_t talkState; /* enum type */
public long reasonCode;
public ATTWorkMode_t pendingWorkMode; /* enum type */
public long pendingReasonCode;
};
C++ アプリから受信したバイトは次のとおりです (最初の 6 バイトはヘッダーのようです)。
02 00 68 00 30 0f 0a 01 03 0a 01 01 02 01 00 0a 01 ff 02 01 00
^^ ^^ ^^ ^^ ^^
上記で、受け取ると予想される値 (3、1、0、-1、0) をマークしました。C# 構造体を定義するときにさまざまな Pack 値を試しましたが、正しく解析されません。これは、C# で構造体を埋めるために使用しているコマンドです。
ATTQueryAgentStateConfEvent_t stateDetails = (ATTQueryAgentStateConfEvent_t)Marshal.PtrToStructure(Marshal.UnsafeAddrOfPinnedArrayElement(confPrivData.data, 6), typeof(ATTQueryAgentStateConfEvent_t));
何か間違ったことをしていますか、それともこの C++ アプリはカスタム シリアライザーを使用していますか? C++ の enum と long は 4 バイトであると予想します...値をバイトごとに抽出できることはわかっていますが、可能であれば自動化したいと考えています。ヒントをありがとう。