2012-04-06 13 views
0

Diese strukturierten Daten werden über eine UDP-Verbindung gesendet. Ich kann die UDP-Pakete lesen, aber ich habe Probleme mit dem Parsen der Daten, die von diesem C++ Struct kommen.Lesen dieser C++ - Marshalled-Daten in C# über UDP-Verbindung

hier ist die Struct:

struct scanner_status{ 
    // --- 
    u_short UDP_STATUS; 
    u_short TCP_COMMAND; 
    u_short TCP_LOGGING; 
    // scanner attributes 
    EPlatformModelNumber ModelNo; 
    string SerialNo; 
    bool bHasCT; 
    bool bHasPET; 
    bool bHasSPECT; 
    // physical 
    EBedType_mMM _eCurrBedType; 
    int_16 _CurrPallet; 
    bool _bTunnelPresent; 
    // 
    scanner_status() 
     : UDP_STATUS(u_short(~0)) 
     , TCP_COMMAND(u_short(~0)) 
     , TCP_LOGGING(u_short(~0)) 
     , ModelNo(eUnknownPlatformModelNumber) 
     , bHasCT(false) 
     , bHasPET(false) 
     , bHasSPECT(false) 
     , _eCurrBedType(emMM_BedType_Unknown) 
     , _CurrPallet(-1) 
     , _bTunnelPresent(false) 
    { } 
}; 
decl_marshalling(scanner_status); 

ich Hilfe dieses bei der Lektüre in C# erhalten möchte, und ich bin nicht wirklich vertraut mit C++ und mit Rangier-, ao ist jede Hilfe sehr geschätzt.

+1

Vermutlich haben Sie ein 'byte []' mit den Rohdaten, richtig? Haben Sie [System.BitConverter] (http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx) angeschaut? Padding ist die eine Sache, die dies verkompliziert, und ohne den Compiler und Compiler _settings_ zu kennen, die zum Erstellen des C++ - Codes verwendet werden, können wir nur raten. – ildjarn

Antwort

1

Sie müssen eine ähnliche Struktur in C# mit äquivalenten .net-Typen erstellen. Sie müssen auch Ihre C# -Struktur wie folgt dekorieren. Stellt sicher, dass die Reihenfolge dieselbe wie in der C++ - Struktur ist, da Sie sicherstellen müssen, dass das Speicherlayout identisch ist.

[StructLayout(LayoutKind.Sequential)] 
struct scanner_status{ 
// --- 
[MarshalAs(UnmanagedType.U1)] 
u_short UDP_STATUS; 
[MarshalAs(UnmanagedType.U1)] 
u_short TCP_COMMAND; 
[MarshalAs(UnmanagedType.U1)] 
u_short TCP_LOGGING; 

Hier ist ein wenig Hilfe von Microsoft. Link

Lassen Sie mich wissen, wenn Sie noch Probleme haben.

+0

'u_short' wäre' UnmanagedType.U2', nicht 'UnmanagedType.U1'. – ildjarn

+0

mein Schlechter, danke. :) Right Byte wäre UnmanagedType.U1. – ervinbosenbacher

+0

Danke, ich werde diese heute ausprobieren und sehen, wie es funktioniert. –