Ik ben tegen een probleem aangelopen met het inlezen van de Structure vanuit een file.
Alles leek goed te gaan maar ik ben erachter gekomen dat per variabele alleen de eerste byte word uitgelezen.
Dus stel dat er een 4byte structure waarde gevuld moet worden en in het bestand staat op die plaats 0x11223344 dan word de waarde in de structure 0x00000011.
Echter maak ik een unsafe structure met pointers dan werkt het wel correct en word er goed ingelezen.
Alleen ik zou het graag willen dat het werkt zonder gebruik te maken van unsafe code. Aangezien hij elders in de code dan gaat mekkeren als ik die waarde wil gebruiken.
Struct waarbij het fout gaat:
Struct waarbij het goed gaat:
Hier is de code voor het inlezen:
Doe ik iets fout of is er uberhaupt een betere manier om dit te doen?
Alles leek goed te gaan maar ik ben erachter gekomen dat per variabele alleen de eerste byte word uitgelezen.
Dus stel dat er een 4byte structure waarde gevuld moet worden en in het bestand staat op die plaats 0x11223344 dan word de waarde in de structure 0x00000011.
Echter maak ik een unsafe structure met pointers dan werkt het wel correct en word er goed ingelezen.
Alleen ik zou het graag willen dat het werkt zonder gebruik te maken van unsafe code. Aangezien hij elders in de code dan gaat mekkeren als ik die waarde wil gebruiken.
Struct waarbij het fout gaat:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| [StructLayout(LayoutKind.Explicit, Size = 54)] public struct ElfHeader { [FieldOffset(0)] public byte e_ident; [FieldOffset(16)] public ushort e_type; [FieldOffset(18)] public ushort e_machine; [FieldOffset(20)] public uint e_version; (.........) } |
Struct waarbij het goed gaat:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| [StructLayout(LayoutKind.Explicit, Size = 54)] unsafe public struct ElfHeaderStruct { [FieldOffset(0)] public fixed byte e_ident[16]; [FieldOffset(16)] public fixed byte e_type[2]; [FieldOffset(18)] public fixed byte e_machine[2]; [FieldOffset(20)] public fixed byte e_version[4]; (.....) } |
Hier is de code voor het inlezen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| BinaryReader reader = new BinaryReader(File.OpenRead(this.fileName)); // Lees de header van een executable byte[] buff = new byte[Marshal.SizeOf(elfHeader)]; reader.Read(buff, 0, Marshal.SizeOf(elfHeader)); reader.Close(); // Reserveer geheugen voor de ElfHeaderStruct IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(elfHeader)); // Kopieer de ingelezen byte array naar het // gereserveerde geheugen Marshal.Copy(buff, 0, ptr, buff.Length); // Marshal vanuit het geheugen naar de // managed struct elfHeader = (ElfHeaderStruct)Marshal.PtrToStructure(ptr, typeof(ElfHeaderStruct)); // Geef het geheugen weer vrij Marshal.FreeHGlobal(ptr); return 0; |
Doe ik iets fout of is er uberhaupt een betere manier om dit te doen?