2012-05-31 29 views
5

ich unten ein C++ struct haben:Convert C++ struct in C#

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

Wie kann ich es in C# struct konvertieren, serialisiert sie und über TCP-Socket senden?

Danke!

upd

So C# -Code wird?

[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); 
} 

Antwort

9

Die C# Version dieser Struktur wäre:

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

Was dies über eine Buchse zu senden, können Sie einfach direkt die binären Daten senden. Das Marshal class verfügt über Methoden, um einen Zeiger (IntPtr) von der Struktur abzurufen und in einem Bytearray zu kopieren.

+0

Vielen Dank für Ihre Antwort, können Sie mir helfen, ist alles in Ordnung mit meinem Code zu kopieren es zu puffern und zu senden? – Becker

+0

@Becker Sie sollten StructureToPtr, nicht GetComInterfaceForObject verwenden. Siehe: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.structuretoptr.aspx#Y1000 –

+0

Vielen Dank! Tut mir leid, ich habe so etwas noch nie gemacht. Ich habe meinen Code bearbeitet, jetzt alles in Ordnung? – Becker

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

edit: thx Reed

+3

Es sollte Uint sein, nicht ulong - Ein C++ "unsigned long" ist 4 Bytes, dh: UInt32 in C# –