Şunun gibi bir C# yapısına sahip olduğumu varsayalım:Yapı ofseti almak için C# komutu?
[StructLayout(LayoutKind.Explicit)]
struct IMAGE_DOS_HEADER {
[FieldOffset(60)] public int e_lfanew;
}
Şimdi bir dosyadan veri okuduğumu varsayalım:
byte[] data = new byte[4096];
FileStream f = new FileInfo(filename).Open(FileMode.Open, FileAccess.Read);
int n = f.Read(data, 0, 4096);
Şimdi okuduğumdan emin olmak için n
test etmek istiyorum e_lfanew
değerini almak için yeterli bayt. Yeniden yazmadan 60 değerini (FieldOffset) alabileceğim bir yol var mı? Bunun gibi bir şey arıyorum:
if (n >= offsetof(IMAGE_DOS_HEADER.e_lfanew) + sizeof(int)) {
...
}
Böyle bir komut var mı? Benim gerçek kodumda, bu testlerin birçoğunu yapmak zorundayım ve bu sayıları, yapıdaki önceki alanları ekleyerek ya da FieldOffset özniteliklerinin değerlerini kopyalarken, el ile rakamları elle yazmak sıkıcı ve hataya eğilimli görünüyor. Daha iyi bir yolu var mı?
Vay, ben (nobugz yıllardan hariç) herhangi bir gerçek cevap almak sanmıyordum ve burada üç seçenek var! Hangisini seçeceğimi pek bilmedim, bu yüzden hepsini oy kullandım. Sadece sabitleri tanımlamak mantıklı bir yaklaşımdır, ancak yapının düzenini nasıl etkilediğini sinirlendiriyor. Ben hala yönetilen/yönetilmeyen inceliklerini öğreniyorum, ama wj32 haklı olduğunu düşünüyorum çünkü derleyici bana yapıya bir işaretçi göstermeme izin veriyor, yönetilen/yönetilmeyen ofsetlerin aynı olduğunu biliyorum. Bu yüzden onun cevabı ile gidiyorum çünkü okunması en kolay kodu üretiyor gibi görünüyor. Böyle harika cevaplar için hepinize teşekkür ederim! –