2017-03-06 2 views
-2

Ich habe eine folgende Struktur in C:Wie mit Zeigern in C# C-Struktur schreiben

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; 

Und ich brauche es in C# zu schreiben. Ich habe versucht, es wie zu definieren:

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

Aber es ist der falsche Weg. Kannst du mir helfen, dies in C# zu übersetzen?

+0

Zeiger verwenden Ich glaube, Sie werden Ihren Code als 'unsafe' und erlauben unsicheren Code in Ihr Projekt Eigenschaften kennzeichnen müssen. –

+0

Nein, 'IntPtr' erfordert nicht 'unsicher' (frag nicht warum) ... Der Code ist korrekt. – xanatos

+0

Warum brauchen Sie Zeiger? Versuchen Sie nur, eine Struktur mit einigen Arrays als Mitglieder zu deklarieren? Wenn ja, verwende Arrays, keine Zeiger. – adv12

Antwort

1

Sie benötigen fixed arrays in der Struktur.

Versuchen Sie dieses Beispiel, in dem nur das Feld fs mit verwalteten Stringkonvertierungen über die Fs-Eigenschaft behandelt wird.

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

Mehr auf festen Puffer here - Dot Net Perls

+0

Danke, es ist was ich brauchte! – Gramin