2010-08-15 4 views
1

Je veux convertir le code ci-dessous pour C#:C++ C# déclaration de tableau

struct Elf32_Ehdr { 
    uint8 e_ident[16]; // Magic number and other info 
    uint16 e_type;  // Object file type 
    uint16 e_machine;  // Architecture 
    uint32 e_version;  // Object file version 
    uint32 e_entry;  // Entry point virtual address 
    uint32 e_phoff;  // Program header table file offset 
    uint32 e_shoff;  // Section header table file offset 
    uint32 e_flags;  // Processor-specific flags 
    uint16 e_ehsize;  // ELF header size in bytes 
    uint16 e_phentsize; // Program header table entry size 
    uint16 e_phnum;  // Program header table entry count 
    uint16 e_shentsize; // Section header table entry size 
    uint16 e_shnum;  // Section header table entry count 
    uint16 e_shstrndx; // Section header string table index 
}; 

Apparemment, elle correspond à boîtier différent. uint16 -> UInt16
uint32 -> UInt32
uint64 -> UInt64

Et apparemment, cartes uint8 à octet.

Le problème est:

Byte e_ident[16]; // Magic number and other info<br /> 


ne compilera pas, il est dit: la taille de tableau ne peut pas être déclaré dans la déclaration des variables ...

Quoi, pas de tableau de taille fixe sans nouvelle?

Est-ce exact de mapper à ceci:

Byte[] e_ident = new Byte[16]; // Magic number and other info 



ou se qui se révèlent tout à fait tort?

Répondre

5

Vous aurez besoin des Structlayout et des attributs MarshalAs et utiliser quelque chose comme:

//untested 
[Structlayout] 
struct Elf32_Ehdr 
{ 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=16)] 
    Byte e_ident[16]; // Magic number and other info 
    Uint16 e_type;  // Object file type 
    ... 
} 

Mais considérez ceci un indice pour des recherches plus poussées, ce n'est pas quelque chose que je sais beaucoup de choses sur.

+0

Il ne compile pas, mais la réponse la plus élevée a été votée. Lieu étrange, n'est-ce pas? –

+0

@Hans, c'était de mémoire, c'est ce que // le drapeau non testé est pour. Je n'ai jamais prétendu/prétendu compilé. Cela semble fonctionner comme un pointeur cependant. Et vous étiez tout simplement en retard de 3 heures (-: –

+0

Je sais, un peu grincheux cet après-midi, j'ai supprimé un tas de bonnes réponses, des choses compilées. –

3

Vous devez utiliser un fixed-size buffer - bien que cela nécessite la structure doit être déclarée dans le code dangereux:

unsafe struct Elf32_Ehdr 
{ 
    fixed byte e_ident[16]; 
    ushort type; 
    // etc 
} 

Vous pouvez également besoin [StructLayout(StructLayoutKind.Sequential)] ou [StructLayout(StructLayoutKind.Explicit)]. Fondamentalement, le tampon de taille fixe s'assure que les données sont en ligne, plutôt que de créer un tableau séparé qui nécessite un astucieux rassemblement.