C# 字节数组编组

C# 字节数组编组,c#,c++,marshalling,C#,C++,Marshalling,我的应用程序正在通过UDP套接字从另一个应用程序接收结构。另一个应用程序是用C++编写的。结构具有不同类型的变量。 在我的应用程序端,我将接收到的消息从字节数组解码为所需的类型,并按以下方式将其放入字典类型变量DecodedMessage: DecodedMessage.Add("VarName", (float)BitConvertor.ToInt32(Buffer, VarOffset)); 问题是我得到的值不正确。我相信问题是我必须做一些编组,但我不知道如何做。 C++应用程序使用了一个

我的应用程序正在通过UDP套接字从另一个应用程序接收结构。另一个应用程序是用C++编写的。结构具有不同类型的变量。 在我的应用程序端,我将接收到的消息从字节数组解码为所需的类型,并按以下方式将其放入字典类型变量
DecodedMessage

DecodedMessage.Add("VarName", (float)BitConvertor.ToInt32(Buffer, VarOffset));
问题是我得到的值不正确。我相信问题是我必须做一些编组,但我不知道如何做。
C++应用程序使用了一个“γ”PrimaPACK(1)声明。

< P>如果C++应用程序正在发送浮点值,则需要使用ToTe32()。但从你的问题中不清楚,如果是这种情况,或者C++应用程序是否发送了你想保存为浮点值的int值。 编辑

< >你的C++应用程序正在发送一个特定的结构,假设它看起来是这样的:

struct whatever
{
   int var1;
   float var2;
   byte var3[16];
}
var binReader = new BinaryReader(new MemoryStream(Buffer));
int var1 = binReader.ReadInt32();
float var2 = binReader.ReadSingle();
byte[] var3 = binReader.ReadBytes(16);
由于您知道数据的结构,因此可以使用如下二进制读取器读取数据:

struct whatever
{
   int var1;
   float var2;
   byte var3[16];
}
var binReader = new BinaryReader(new MemoryStream(Buffer));
int var1 = binReader.ReadInt32();
float var2 = binReader.ReadSingle();
byte[] var3 = binReader.ReadBytes(16);

现在你可以用你的数据做任何你想要的。

< P>如果C++应用程序正在发送浮点值,你需要使用ToTe32()。但从你的问题中不清楚,如果是这种情况,或者C++应用程序是否发送了你想保存为浮点值的int值。 编辑

< >你的C++应用程序正在发送一个特定的结构,假设它看起来是这样的:

struct whatever
{
   int var1;
   float var2;
   byte var3[16];
}
var binReader = new BinaryReader(new MemoryStream(Buffer));
int var1 = binReader.ReadInt32();
float var2 = binReader.ReadSingle();
byte[] var3 = binReader.ReadBytes(16);
由于您知道数据的结构,因此可以使用如下二进制读取器读取数据:

struct whatever
{
   int var1;
   float var2;
   byte var3[16];
}
var binReader = new BinaryReader(new MemoryStream(Buffer));
int var1 = binReader.ReadInt32();
float var2 = binReader.ReadSingle();
byte[] var3 = binReader.ReadBytes(16);

现在,您可以对该数据执行任何操作。

UDP应用程序可以序列化对象并通过UDP套接字传输消息,而不是编组。这是一个现代的方法,由M+C++库支持(示例:使用Boost库进行序列化),实现起来非常简单,速度快。

代替编组,UDP应用程序可以通过UDP套接字来序列化对象并传递消息。这是一个现代方法,并由M+C++库支持。例:使用Boost库进行序列化是很容易和快速实现的。

你能给出一个不正确的值的例子吗?比如,期望值=x,GoD=y。如果C++应用程序使用大的字节编码和C代码,小的字节序或副字符,则它可能与字节数有关。versa@DenisYarkovoy数字只是爆炸式增长,而不是得到大约1.02,我得到1E + 09或SO.在你的代码中你正在从缓冲区读取It32,所以你不能期望得到1.02。如果你在C++结构中得到浮点数,而不是Tyd给出的答案是正确的,你需要使用Tungle转换器来读取你的浮点属性,你能给出一个不正确的值的例子吗?可能与CudiaNess有关,如果你的C++应用程序使用大的字节编码和C代码,小字节或副字符。versa@DenisYarkovoy数字正在爆炸。我得到的不是大约1.02的值,而是1E+09左右。在代码中,您正在从缓冲区读取Int32,因此您不能期望得到1.02。如果在c+TySt比TYD给出的答案是正确的,你需要使用Toxle转换器来读取你的浮点属性,你能给出一个不正确的值的例子吗?比如,期望值=x,GoD=y?如果C++应用程序使用大的字节编码和C代码,小的字节序或副字符,那么它可能与字节数有关。versa@DenisYarkovoy数字正在爆炸式增长如果你得到的代码是1.02,那么你就不能从中得到1.02。如果你在C++结构中得到浮点数,而不是Tyd给出的答案是正确的,你需要使用Tungle转换器来读取你的浮点属性,C++发送一个结构域,它有字段。不同类型(即整数、浮点、字符、长字符)。此外,我确实希望将所有数据保存为浮点。也就是说,您认为位转换器存在问题吗?@AnR,不要转换它们,在接收时存储它们(
byte[]
?),或者以某种方式发送它们的类型,并使用
switch/case
选择如何转换它们(仍然,<代码> VarName <代码>应该是代码>对象< /代码>以保持任何类型)C++发送一个结构,该结构具有不同类型的字段(即int、浮点、字符、long)。。此外,我确实希望将所有数据保存为浮点数。也就是说,您认为位转换器有问题吗?@AnR,不要转换它们,在接收时存储它们(
byte[]
?),或者以某种方式发送它们的类型,并使用
switch/case
选择如何转换它们(仍然,<代码> VarName <代码>应该是代码>对象< /代码>以保持任何类型)C++发送一个结构,该结构具有不同类型的字段(即int、浮点、字符、long)。。此外,我确实希望将所有数据保存为浮点数。也就是说,您认为位转换器有问题吗?@AnR,不要转换它们,在接收时存储它们(
byte[]
?),或者以某种方式发送它们的类型,并使用
switch/case
选择如何转换它们(不过,
VarName
应该是
object
才能保存任何类型)