具有3字节块的序列化C 结构

Serialized C++ struct with 3-byte blocks?

本文关键字:序列化 结构 字节 具有      更新时间:2023-10-16

i有一个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#struct时,我已经尝试了不同的包装值,但根本无法正确解析。这是我用来填充C#中的结构的命令:

ATTQueryAgentStateConfEvent_t stateDetails = (ATTQueryAgentStateConfEvent_t)Marshal.PtrToStructure(Marshal.UnsafeAddrOfPinnedArrayElement(confPrivData.data, 6), typeof(ATTQueryAgentStateConfEvent_t));

我在做错了什么,还是此C 应用使用一些自定义序列化器?我希望C 枚举和渴望是4个字节...我知道我可以通过字节提取值,但是如果可能的话,我想自动化它。感谢您的任何提示。

正如我在我的评论中所说的那样,您没有提供有关使用哪些序列化器的信息。但是,格式使我想起抽象语法符号一(asn1),并且给出的示例流实际上是有效的,即类型ID匹配ASN1中指定的iD(30 = sequence,02 = Integer,...)您应该找到很多库能够对ASN1流进行挑选,但是我对C#没有经验,所以我目前无法给您任何建议。