2017-03-06 70 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