2012-04-06 3 views
0

この構造化データはUDP接続を介して送信されています。私はUDPパケットを読むことができますが、このC++ Structから来るデータを解析することに問題があります。ここ このC++整列化データをC#でのUDP接続で読む

が構造体である:

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

答えて

1

同等の構造をC#で作成する必要があります。また、次のように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; 

ここにはMicrosoftのヘルプがあります。 Link

まだ問題がある場合は教えてください。

+0

'u_short'は' UnmanagedType.U1'ではなく 'UnmanagedType.U2'になります。 – ildjarn

+0

私の悪い、ありがとう。 :) Right ByteはUnmanagedType.U1になります。 – ervinbosenbacher

+0

ありがとう、私は今日これらを試し、それがどのように動作するか見る。 –

関連する問題