2012-05-31 14 views
5

Mam C++ struct poniżej:Konwersja C++ C# struct do

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

jaki sposób można przekonwertować go do C# struct, szeregować je i wysyłać za pośrednictwem gniazda TCP?

Dzięki!

UPD

Więc kod C# będzie?

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

Odpowiedz

9

C# wersja tej struktury byłoby:

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

chodzi o wysyłanie go poprzez gniazda, można po prostu wysłać dane binarne bezpośrednio. Marshal class ma metody uzyskiwania wskaźnika (IntPtr) ze struktury i kopiowania do tablicy bajtów.

+0

Dzięki za odpowiedź, możesz mi pomóc, to wszystko w porządku z moim kodem o kopiowanie do bufora i wysłanie go? – Becker

+0

@Becker Powinieneś używać StructureToPtr, a nie GetComInterfaceForObject. Zobacz: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.structuretoptr.aspx#Y1000 –

+0

Dzięki! Przepraszam, po prostu nigdy wcześniej nie robiłem takich rzeczy. Zmieniłem kod, teraz wszystko w porządku? – Becker

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

edit: thx trzcina

+3

Powinno to być uint, nie ulong - C++ "unsigned long" ma 4 bajty, tj .: UInt32 w C# –