c++ - 具有 3 字节 block 的序列化 C++ 结构?

标签 c++ struct marshalling padding pack

我有一个 C++ 应用程序正在向我的 C# 应用程序发送序列化结构,我想自动将字节直接复制到我在 C# 中创建的新结构。然而,通过网络发送的结构似乎有 3 个字节的 block ,这似乎很奇怪。

这是 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 个字节似乎是一些 header ):

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

最佳答案

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

关于c++ - 具有 3 字节 block 的序列化 C++ 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13083002/

相关文章:

c++ - 为什么在struct中使用字符串时出现运行时错误

json - 无需启动双引号的json标记有效

c - 如何在全局范围内使用 const 结构体来初始化结构体数组?

c# - 为什么编码对象不保留在 native 代码中修改的值?

c++ - 为什么 setspacing 属性不起作用?

不需要内存空间的 C++ 零大小数组?

c++ - QFile::flush() 与 QFile::close()

c++ - 编译 RInside 代码时出错

c# - Marshal - 我需要释放任何资源吗?

c++ - 提示是否使用原生C++ DLL : PINVOKE & Marshaling?