Supponiamo che io sono un C# struct come questo:Comando C# per ottenere lo struct offset?
[StructLayout(LayoutKind.Explicit)]
struct IMAGE_DOS_HEADER {
[FieldOffset(60)] public int e_lfanew;
}
Ora supponiamo che ho letto nei dati da un file, in questo modo:
byte[] data = new byte[4096];
FileStream f = new FileInfo(filename).Open(FileMode.Open, FileAccess.Read);
int n = f.Read(data, 0, 4096);
Ora voglio provare n
per assicurarsi che ho leggere abbastanza byte per ottenere il valore di e_lfanew
. C'è un modo per ottenere il valore 60 (FieldOffset) senza doverlo ridigitare? Sto cercando qualcosa di simile:
if (n >= offsetof(IMAGE_DOS_HEADER.e_lfanew) + sizeof(int)) {
...
}
Esiste un comando del genere? Nel mio codice attuale, devo eseguire molti di questi test, e sembra noioso e soggetto a errori digitare i numeri manualmente, aggiungendo i campi precedenti nella struct o copiando i valori dagli attributi FieldOffset. C'è un modo migliore?
Wow, non pensavo che avrei avuto una risposta reale (ad eccezione di nobugz), e qui ho tre scelte! Sapevo a malapena quale scegliere, quindi li ho votati tutti. Definire semplicemente le costanti è un approccio ragionevole, ma è un po 'fastidioso il modo in cui offusca il layout della struttura. Sto ancora imparando le sottigliezze del managed/unmanaged, ma penso che wj32 abbia ragione, dal momento che il compilatore mi sta già permettendo di ottenere un puntatore alla struct, so che gli offset gestiti/non gestiti sono gli stessi. Quindi vado con la sua risposta perché sembra produrre il codice più facile da leggere. Grazie a tutti per le risposte così fantastiche! –