我在通过TCP套接字发送的C#struct的字节到C ++客户端以正确读取时遇到了一些麻烦。这是结构......
C#中的结构
public struct TankBattleStateData
{
public int playerID;
public float currentHealth;
public Vector3 position;
public Vector3 forward;
public Vector3 cannonForward;
public int canFire;
public int tacticalCount;
}
C ++中的结构
struct TankBattleStateData
{
int playerID;
float currentHealth;
float position[3];
float forward[3];
float cannonForward[3];
int canFire;
int tacticalCount;
};
传输过程如下......
System.Runtime.InteropServices.Marshal
获取表示struct unsigned char
数组,如果需要,可以在复制之前调整大小
TankBattleStateData *
,并取消引用它以访问其字段。我一致地发现,最后一个字段tacticalCount
在C ++客户端上的值与在C#客户端上的值不同。例如,我将从服务器发送1
并将81742424
返回给客户端。
环境
操作系统:Windows 10 x64
服务器:C#w / .NET Framework 2.0(Unity3D 5.3.2f1)
客户端:C ++ w / MSVC ++ 14
我想知道什么
我遇到的一个打嗝是C#bool
被编组为4 bytes,而不是1个字节,这是MSVC ++ 14中bool的大小。我想使用bool
,但为了减少可能出现的问题,我现在正在使用int
。
答案 0 :(得分:1)
将[StructLayout(LayoutKind.Sequential)]
添加到结构中,然后使用[FieldOffset]
布置字段以与C ++版本完全匹配。
答案 1 :(得分:0)
您应该阅读的内容是数据结构的序列化和反序列化。有多种协议,库和方法可供使用。将数据原始发送到内存或从内存发送数据可能会对字节序,文本字段和数组产生奇怪的影响。