3

シリアル化された構造体を 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 バイトであると予想します...値をバイトごとに抽出できることはわかっていますが、可能であれば自動化したいと考えています。ヒントをありがとう。

4

1 に答える 1

3

私のコメントで述べたように、どのシリアライザーが使用されているかについての情報はありませんでした。ただし、この形式は抽象構文記法 1 (ASN1) を思い起こさせ、指定されたストリームの例は実際に有効です。つまり、タイプ ID は ASN1 で指定されたものと一致します (30 = SEQUENCE、02 = INTEGER、...)。たくさんのライブラリが見つかるはずです。 ASN1 ストリームをデシリアライズすることはできますが、私は C# についての経験がないため、現時点では何の提案もできません。

于 2012-10-26T08:54:40.673 に答える