具有3字节块的序列化C 结构
Serialized C++ struct with 3-byte blocks?
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#没有经验,所以我目前无法给您任何建议。
相关文章:
- 如何在C++中序列化结构数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- 使用指向 struc 的指针序列化结构
- C++ 提升 - 包含类层次结构对象的类的序列化
- 如何从平面缓冲区中反序列化联合结构的 void* 值的大小
- 将载体和cv :: mat to Disk的存储结构 - C 中的数据序列化
- 序列化没有"save"方法的大型结构
- 在 C# 中序列化这些值以在C++中作为已知结构正确读取时遇到问题
- 无序列图会创建一个零初始化结构吗?
- 如何在结构中序列化unique_ptr<char[]>
- 我的数据结构的最佳序列化方法
- 分段错误:C++中的结构序列化和 MPI 数据传输
- 跳过层次结构中的中间类,并使用boost ::序列化
- Boost::序列化存储结构时的堆栈溢出错误
- C 使用谷物序列化结构的静态阵列
- 具有3字节块的序列化C 结构
- 序列化结构以归档,并用字符串再次对其进行启用
- 序列化结构
- 序列化结构的STL映射