2014-01-07 39 views
-2

由於value-type成員和reference-type成員在工會內部結構的混合,我將一個本機win 32代碼編組爲c#,因此我將所有引用類型轉換爲字節並解決了大小問題他們通過使用fielOffset ..現在我想訪問這些成員之一的價值,我不知道如何去做。下面的代碼是樣本。從非託管內存中的字節讀取字符陣列

這裏是C++結構

typedef struct 
    {  
    int Port; 
    char SubsId[FIELD_SIZE_SUBS_ID+1]; 
    char Options[FIELD_SIZE_OPTIONS+1]; 
    } MMTPRcnxReq; 

這裏是C#相當於

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)] 
public struct MMTPRcnxReq 
{ 
    [FieldOffset(0)] 
    public Int32 Port; 

    [FieldOffset(4)] 
    public byte SubsId; 

    [FieldOffset(4 + FIELD_SIZE_SUBS_ID + 1)] 
    public byte Options; 
} 

現在我要訪問SUBID的價值實際上是字符數組和〔實施例比較它一個字符串在我的託管代碼中, 像下面那樣

if(mMTPRcnxReq.SubsId == "12345") // WRONG 

如何我可以這樣做嗎?

+2

奇怪的代碼。你根本不需要'FieldOffset',使用'[MarshalAs(UnmanagedType.ByValArray,SizeConst = FIELD_SIZE_SUBS_ID + 1)] public Byte [] SubsId;',這與Options相同。 –

+0

我對你的問題感到困惑,首先'char'有多個'byte',而一個字符串至少有1個'char'。 'SubsId'不能是一個字符數組,如果它聲明爲'byte'。 – Jodrell

+0

@AlexFarber,我根本不想使用引用類型。 – Parid0kht

回答

2

您可能需要在這裏使用帶固定大小緩衝區的unsafe

unsafe struct MMTPRcnxReq 
{ 
    public int Port; 
    public fixed byte SubsId[FIELD_SIZE_SUBS_ID+1]; 
    public fixed byte Options[FIELD_SIZE_OPTIONS+1]; 
} 

固定大小的緩衝區是值類型,這將讓你把這些結構中的一個FieldOffset(0) C#聯合中。

閱讀像這樣的字符串:

string SubsId; 
unsafe 
{ 
    fixed (byte* ptr = req.SubsId) 
    { 
     // I presume that req.SubsId is null-terminated 
     SubsId = Marshal.PtrToStringAnsi((IntPtr)ptr); 
    } 
} 

你可能會寫struct的助手getter和setter方法,也許性能,管理固定大小的緩衝區。