Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化结构的数组 我再次通过C++程序从UDP接收结构, 现在我将结构移植到C,例如: [Serializable] struct sample { public int in; public byte[] arr; public int[] arr2; public float fl; }_C#_Arrays_Struct_Deserialization - Fatal编程技术网

C# 反序列化结构的数组 我再次通过C++程序从UDP接收结构, 现在我将结构移植到C,例如: [Serializable] struct sample { public int in; public byte[] arr; public int[] arr2; public float fl; }

C# 反序列化结构的数组 我再次通过C++程序从UDP接收结构, 现在我将结构移植到C,例如: [Serializable] struct sample { public int in; public byte[] arr; public int[] arr2; public float fl; },c#,arrays,struct,deserialization,C#,Arrays,Struct,Deserialization,那么反序列化程序如何知道一个数组何时结束,另一个数组何时开始? 可以指定数组的大小吗? 我不想使用fixed,因为这使我的代码不安全,而且我也不能使用构造函数,因为结构不允许包含没有参数的构造函数 有什么建议吗 //编辑: 已知阵列的长度为32和4。 问题是我不知道如何将此信息传递给反序列化程序 发送者是C++,这样的作品: char* pr = &sample; int i=0; while (i<sizeof(sample)) { udp.send(*(pr+i)) i++

那么反序列化程序如何知道一个数组何时结束,另一个数组何时开始? 可以指定数组的大小吗? 我不想使用fixed,因为这使我的代码不安全,而且我也不能使用构造函数,因为结构不允许包含没有参数的构造函数

有什么建议吗

//编辑:

已知阵列的长度为32和4。 问题是我不知道如何将此信息传递给反序列化程序

发送者是C++,这样的作品:

char* pr = &sample;
int i=0;
while (i<sizeof(sample))
{
 udp.send(*(pr+i))
 i++;
}

这取决于用于将结构传递到导线上的格式

如果说它是json,那么每个字段都有一个键,数组将被[]包围

如果说它是xml,那么您将期望一个带有子节点的arr节点

如果是任意格式,你需要知道它的格式


反序列化程序有一些默认行为,但如果传递的数据不是默认格式,则需要准确地告诉它们如何反序列化

这取决于用于在导线上传递结构的格式

如果说它是json,那么每个字段都有一个键,数组将被[]包围

如果说它是xml,那么您将期望一个带有子节点的arr节点

如果是任意格式,你需要知道它的格式


反序列化程序有一些默认行为,但如果传递的数据不是默认格式,则需要准确地告诉它们如何反序列化

原始数据是如何记录的?我希望这里有一些东西可以告诉你,例如,我可能希望它说格式纯粹是一个例子

4字节NBO Int32英寸 4字节NBO Int32 arr长度 len字节 arr2的4字节NBO长度 4*len字节arr2,每个字节在NBO Int32中 4字节IEEE-754 fl 你需要知道格式


<>编辑:如果C++数组是已知的固定长度,那么你只需要提前知道这些长度。

< P>以及原始数据是如何记录的?我希望这里有一些东西可以告诉你,例如,我可能希望它说格式纯粹是一个例子

4字节NBO Int32英寸 4字节NBO Int32 arr长度 len字节 arr2的4字节NBO长度 4*len字节arr2,每个字节在NBO Int32中 4字节IEEE-754 fl 你需要知道格式


<>编辑:如果C++数组是已知的固定长度,那么你只需要提前知道这些长度。

现在你已经告诉我们长度是预定义长度的,那么下面的语句变得更清晰:

我不知道如何将此信息传递给反序列化程序

事实上,它变得毫无意义。这里没有预定义的序列化程序可以帮助您。您有两个选择:

答:编写您自己的序列化程序,并在了解格式后处理数据-可能使用BinaryReader:

对于较大的缓冲区,您可以将ptr视为多个样本的不安全数组,通过索引访问:

int @in = ptr[i].@in;


但老实说。。。有这么多邪恶的东西,我真的不知道从哪里开始。。。只是除非你完全知道那里的每一行都在做什么,以前做过,并且理解所有的陷阱。。。现在你已经告诉我们长度是预先定义的长度,那么下面的陈述就更清楚了:

我不知道如何将此信息传递给反序列化程序

事实上,它变得毫无意义。这里没有预定义的序列化程序可以帮助您。您有两个选择:

答:编写您自己的序列化程序,并在了解格式后处理数据-可能使用BinaryReader:

对于较大的缓冲区,您可以将ptr视为多个样本的不安全数组,通过索引访问:

int @in = ptr[i].@in;


但老实说。。。有这么多邪恶的东西,我真的不知道从哪里开始。。。只是除非你完全知道那里的每一行都在做什么,以前做过,并且理解所有的陷阱。。。想都别想

好吧,把整个事情切换到类有助于解决构造函数问题,但我还是不知道这是怎么回事,有人能解释一下吗?什么是怎么回事?什么是C++的序列化?你还没有告诉我们你目前在反序列化方面做了什么,所以很难评论它是如何工作的……好吧,将整个事情切换到类有助于解决构造函数问题,但我仍然不知道它是如何工作的,有人能解释吗?什么工作方式?什么是C++的序列化?您还没有告诉我们您目前在反序列化方面的尝试,因此很难对其工作原理进行评论…发送方只是将指针放在结构的开头,然后一个字节接一个字节地发送,我想这与任意操作相同。所以我知道数组有多长,但是我怎么告诉序列化程序呢?@ChristianElsner,那么t中的指针是什么意思
他的背景?指针一旦序列化就毫无意义了……给定代码,它高度依赖于计算机的C++实现,如何将数组写入到该线中。这将取决于计算机在内存中存储阵列的方式。如果你有控制UDP代码,我建议你改变它不要使用字节转储,而不是决定你想要写的格式,然后写它。我不能改变C++代码,我已经很高兴我有读访问来弄清楚这个东西是如何工作的…代表被记录:由CodeWell记录在这种情况下,您只能希望检查字节数组,如果它包含“数组长度”信息。如果没有,我猜不会,那么你就什么也做不了。发送方只是把一个指针放在结构的开头,然后一个字节接一个字节地发送,我猜这与任意操作是一样的。我知道数组有多长,但我如何告诉序列化程序?@ChristianElsner,在这种情况下,指针是什么意思?指针一旦序列化就毫无意义了……给定代码,它高度依赖于计算机的C++实现,如何将数组写入到该线中。这将取决于计算机在内存中存储阵列的方式。如果你有控制UDP代码,我建议你改变它不要使用字节转储,而不是决定你想要写的格式,然后写它。我不能改变C++代码,我已经很高兴我有读访问来弄清楚这个东西是如何工作的…代表被记录:由CodeWell记录在这种情况下,您只能希望检查字节数组,如果它包含“数组长度”信息。如果没有,我猜不会,那你就无能为力了。好吧,我实际上已经习惯了指针,但我同意最好找到绕过指针的方法。我讨厌编写自定义的反序列化程序,但这似乎是正确的方法。谢谢大家的帮助。事实上,我已经习惯了指针,但我同意最好能找到一种绕过指针的方法。我讨厌编写自定义的反序列化程序,但这似乎是正确的方法。谢谢大家的帮助
int @in = ptr[i].@in;