2012-05-31 72 views
5

我有以下C++结构:转换C++结构,以C#

struct CUSTOM_DATA { 
    int id; 
    u_short port; 
    unsigned long ip; 
} custom_data; 

我怎样才能将其转换为C#结构,序列化,并通过TCP套接字发送?

谢谢!

UPD

所以C#代码会是什么?

[StructLayout(LayoutKind.Sequential)] 
public struct CustomData 
{ 
public int id; 
public ushort port; 
public uint ip; 
} 

public void Send() 
{ 
CustomData d = new CustomData(); 
d.id = 12; 
d.port = 1000; 
d.ip = BitConverter.ToUInt32(IPAddress.Any.GetAddressBytes(), 0); 
IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(d)); 
Marshal.StructureToPtr(d, pointer, false); 
byte[] data_to_send = new byte[Marshal.SizeOf(d)]; 
Marshal.Copy(pointer, data_to_send, 0, data_to_send.Length); 
client.GetStream().Write(data_to_send, 0, data_to_send.Length); 
} 

回答

9

这个结构的C#版本是:

[StructLayout(LayoutKind.Sequential)] 
public struct CustomData 
{ 
    public int id; 
    public ushort port; 
    public uint ip; 
} 

至于通过套接字发送这一点,你可以直接发送二进制数据。 Marshal class具有从结构中获取指针(IntPtr)并将其复制到字节数组中的方法。

+0

谢谢您的回答,你能帮助我,是一切ok与我有关复制到缓冲区并把它发送代码? – Becker

+0

@Becker您应该使用StructureToPtr,而不是GetComInterfaceForObject。请参阅:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.structuretoptr.aspx#Y1000 –

+0

谢谢!对不起,我从来没有做过这样的事情。我编辑了我的代码,现在都可以吗? – Becker

1
[StructLayout(LayoutKind.Sequential)] 
struct CUSTOM_DATA { 
    int id; 
    ushort port; 
    uint ip; 
}; 
CUSTOM_DATA cData ; // use me 

编辑: THX芦苇

+3

它应该是uint,而不是ulong - C++“unsigned long”是4个字节,即:C#中的UInt32 –