带有3字节块的序列化C ++结构?

时间:2012-10-26 07:57:03

标签: c++ struct marshalling padding pack

我有一个C ++应用程序,它将序列化结构发送到我的C#应用​​程序,我想自动将字节直接复制到我在C#中创建的新结构。但是,通过网络发送的结构似乎有3个字节的块,这看起来很奇怪。

这是C ++ struct:

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 ++枚举和long是4个字节...我知道我可以逐字节提取值,但我想自动化它,如果可能的话。感谢您的任何提示。

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说,您没有提供有关正在使用的序列化程序的信息。但是,格式让我想起Abstract Syntax Notation One(ASN1),并且给出的示例流实际上是有效的,即类型ID与ASN1中指定的类型匹配(30 = SEQUENCE,02 = INTEGER,...)您应该找到大量的库能够反序列化ASN1流,但我没有C#的经验,所以我现在不能给你任何建议。