2012-04-06 22 views
0

此結構化數據通過UDP連接發送。我可以讀取UDP數據包,但是我無法處理來自此C++ Struct的數據。通過UDP連接在C#中讀取此C++編組數據

這裏是結構:

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

我想獲得幫助,在C#讀這篇文章,我沒有真正熟悉C++,並與編組,AO任何幫助是極大的讚賞。

+1

假設你有一個帶有原始數據的byte [],對不對?你看過['System.BitConverter'](http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx)嗎?填充是使事情複雜化的一件事,並且不知道用於構建C++代碼的編譯器和編譯器_settings_,我們只能猜測。 – ildjarn 2012-04-06 22:27:31

回答

1

您需要在c#中用等效的.net類型創建一個類似的結構。您還需要按照以下方式修飾您的c#結構。確保順序與C++結構中的順序相同,因爲您需要確保內存佈局相同。

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

這裏是微軟的一些幫助。 Link

讓我知道你是否還有麻煩。

+0

'u_short'將是'UnmanagedType.U2',而不是'UnmanagedType.U1'。 – ildjarn 2012-04-06 22:52:28

+0

我不好,謝謝。 :)右字節將是UnmanagedType.U1。 – ervinbosenbacher 2012-04-06 22:56:15

+0

謝謝,我今天會試試看看它是如何工作的。 – 2012-04-09 13:44:03