字节数组编组

Byte array Marshalling

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

DecodedMessage.Add("VarName", (float)BitConvertor.ToInt32(Buffer, VarOffset));

问题是我得到的值不正确。我认为问题在于我必须进行某种封送处理,但我不知道该怎么做。 C++ 应用程序使用#pragma pack(1) 声明。

如果 C++ 应用程序发送浮点值,您需要使用 BitConverter.ToSingle 而不是 ToInt32()。但是从你的问题中不清楚是否是这种情况,或者 C++ 应用程序是否正在发送你只想保存为 float 值的 int 值。

编辑

好的,您的 C++ 应用正在发送某个结构,我们假设它看起来像这样:

struct whatever
{
   int var1;
   float var2;
   byte var3[16];
}

既然你知道数据的结构,你可以像这样用 BinaryReader 读取它:

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

现在您可以对这些数据做任何您想做的事情了。

UDP 应用程序可以序列化对象并通过 UDP 套接字传输消息,而不是编组。这是一种现代方法,并得到许多 C++ 库的支持(示例:使用 boost 库进行序列化非常容易且快速实现。