Объявление массива C ++ to C # - PullRequest
1 голос
/ 15 августа 2010

Я хочу преобразовать приведенный ниже код в C #:

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

По-видимому, он отображается на другой корпус. uint16 -> UInt16
uint32 -> UInt32
uint64 -> UInt64

И, по-видимому, uint8 отображается в Byte.

Проблема:

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


не компилируется, он говорит: размер массива не может быть объявлен в объявлении переменной ...

Что, без массива фиксированного размера без нового?

Это правильно, чтобы сопоставить это с:

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



или это окажется совсем не так?

Ответы [ 2 ]

5 голосов
/ 15 августа 2010

Вам понадобятся атрибуты Structlayout и MarshalAs, и используйте их что-то вроде:

//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
  ...
}

Но подумайте, что это подсказка для дальнейшего поиска, я мало о чем знаю.

3 голосов
/ 15 августа 2010

Вы должны использовать буфер фиксированного размера - хотя для этого требуется, чтобы структура была объявлена ​​в небезопасном коде:

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

Вы можете также нуждаться в [StructLayout(StructLayoutKind.Sequential)] или [StructLayout(StructLayoutKind.Explicit)]. По сути, буфер фиксированного размера гарантирует, что данные являются встроенными, а не создает отдельный массив, который требует хитрой сортировки.

...