Пусть у меня есть C#-структуру, как это:Команда C# для получения смещения структуры?
[StructLayout(LayoutKind.Explicit)]
struct IMAGE_DOS_HEADER {
[FieldOffset(60)] public int e_lfanew;
}
Теперь предположим, что я прочитал в данных из файла, например:
byte[] data = new byte[4096];
FileStream f = new FileInfo(filename).Open(FileMode.Open, FileAccess.Read);
int n = f.Read(data, 0, 4096);
Теперь я хочу проверить n
, чтобы убедиться, что я имею достаточно прочитать байты, чтобы получить значение e_lfanew
. Есть ли способ получить значение 60 (FieldOffset) без его повторного ввода? Я ищу что-то вроде этого:
if (n >= offsetof(IMAGE_DOS_HEADER.e_lfanew) + sizeof(int)) {
...
}
Есть ли такая команда? В моем фактическом коде я должен выполнить несколько из этих тестов, и кажется утомительным и подверженным ошибкам вводить числа вручную, либо путем добавления предыдущих полей в структуре, либо путем копирования значений из атрибутов FieldOffset. Есть ли способ лучше?
Ничего себе, я не думаю, что я бы получить какой-либо реальный ответ (кроме nobugz-х), а вот у меня есть три варианта! Я не знал, что выбрать, поэтому я все-таки проголосовал за всех. Просто определение констант - разумный подход, но это раздражает то, как он запутывает структуру структуры. Я все еще изучаю тонкости управляемых/неуправляемых, но я думаю, что wj32 прав, поскольку, поскольку компилятор уже позволяет мне получить указатель на структуру, я знаю, что управляемые/неуправляемые оффтоны одинаковы. Поэтому я собираюсь с его ответом, потому что он, кажется, производит самый легкий для чтения код. Спасибо всем за такие замечательные ответы! –