2017-03-06 28 views
-2

我在C以下結構:如何在C#中的C結構寫的指針

typedef struct 
{ 
    int mode; 
    unsigned char *fs;//a pointer to sbyte[16] 
    unsigned char *flist;//a pointer to sbyte[128] 
    unsigned char *ival;//a pointer to sbyte[8] 
    unsigned char *ctx;//a pointer to sbyte[8] 
    int fin; 
} mStruct; 

,我需要它寫在C#。我試圖將其定義爲:

[StructLayout(LayoutKind.Sequential,Pack=1)] 
public struct avGostParam 
{ 
    public int mode;//a mode 
    public IntPtr fs;// does char* converts to IntPtr? 
    public IntPtr flist;//does char* converts to IntPtr? 
    public IntPtr ival;//does char* converts to IntPtr? 
    public IntPtr ctx;//does char* converts to IntPtr? 
    public int fin; 
} 

但這是錯誤的方法。你能幫我翻譯成C#嗎?

+0

使用指針,我相信你必須標記你的代碼爲'unsafe',並允許在項目屬性不安全的代碼。 –

+0

不,'IntPtr'不需要'unsafe'(不要問爲什麼)...代碼是正確的。 – xanatos

+0

爲什麼你需要指針?你只是想用一些數組作爲成員來聲明一個結構體?如果是這樣,請使用數組,而不是指針。 – adv12

回答

1

在結構中需要fixed arrays

試試這個例子,其中只有字段fs被視爲通過Fs屬性進行管理的字符串轉換。

public unsafe struct avGostParam 
{ 
    public int mode; 
    public fixed char fs[16]; 
    public fixed char flist[128]; 
    public fixed char ival[8]; 
    public fixed char ctx[8]; 


    public string Fs 
    { 
     get 
     { 
      fixed(char* ptr=fs) 
      { 
       return GetString(ptr, 16); 
      } 
     } 

     set 
     {     
      fixed(char* ptr=fs) 
      { 
       SetString(ptr, 16, value); 
      } 
     } 
    } 

    private static string GetString(char* ptr, int length) 
    { 
     char[] result=new char[length]; 
     for(int i=0; i<length; i++) 
     { 
      result[i]=ptr[i]; 
     } 
     return new string(result); 
    } 
    private static void SetString(char* ptr, int length, string value) 
    { 
     if(value.Length<length) 
     { 
      value=value.PadRight(length); 
     } 
     char[] items=value.ToCharArray(); 
     for(int i=0; i<length; i++) 
     { 
      ptr[i]=items[i]; 
     }    
    } 
} 

unsafe class Program 
{ 
    static void Main(string[] args) 
    { 
     var av=new avGostParam(); 

     av.Fs="ABCDEF"; 

     char* ptr=av.fs; 
     for(int i=0; i<16; i++) 
     { 
      Console.Write(av.fs[i]); 
     } 
    } 
} 

更多關於固定緩衝存儲器here - Dot Net Perls

+0

謝謝,這是我所需要的! – Gramin