Hallo Forum, ich habe eine Klasse wo ich eine Struktur angelegt habe. Nun möchte ich mit Marshal.Struture den Inhalt der Struktur in ein byte Array kopieren aber es will mir einfach nicht gelingen! Bitte kann mir jemand ein kleines Beispiel machen? Vielen Dank und Schönen Sonntag D d ad S s
1 | |
2 | public struct Point |
3 | {
|
4 | public int x; |
5 | public int y; |
6 | public double d; |
7 | public string sepp; |
8 | }
|
die Structur sieht so aus Vielen Dank und Schönen Sonntag D d ad S s
der der auf dem Schlauch steht schrieb: >
1 | > public struct Point |
2 | > { |
3 | > public int x; |
4 | > public int y; |
5 | > public double d; |
6 | > public string sepp; |
7 | > } |
8 | >
|
> > die Structur sieht so aus > > > Vielen Dank und Schönen Sonntag > D d ad S s
1 | [StructLayout(LayoutKind.Sequential)] |
2 | public struct Point { |
3 | //[MarshalAs(UnmanagedType.I4)] auskommentiert, da dies die Defaults sind
|
4 | public int x; |
5 | //[MarshalAs(UnmanagedType.I4)]
|
6 | public int y; |
7 | //[MarshalAs(UnmanagedType.R8)]
|
8 | public double d; |
9 | //[MarshalAs(UnmanagedType.LPStr)]
|
10 | public string sepp; |
11 | }
|
12 | Point point1 = new Point() { x = 1234, y = 2345, d = 3.456, sepp = "45678" }; |
13 | int structLen = Marshal.SizeOf(point1); |
14 | IntPtr ptr = Marshal.AllocHGlobal(structLen); |
15 | |
16 | byte[] dest = new byte[structLen]; |
17 | |
18 | Marshal.StructureToPtr(point1, ptr, false); |
19 | Marshal.Copy(ptr, dest, 0, structLen); |
20 | Marshal.FreeHGlobal(ptr); |
21 | |
22 | // oder Elementweise mit BitConverter.GetBytes...
|
Vielen Dank für deine Hilfe. Ist diese Vorgens weise sinnvoll oder hat das Marshalen Nachteile?
der der auf dem Schlauch steht schrieb: > Vielen Dank für deine Hilfe. > Ist diese Vorgens weise sinnvoll oder hat das Marshalen Nachteile? Kommt drauf an warum das gemacht wird... Eins ist auf jeden Fall sicher: Es kostet Zeit und Speicher. Geht es z.B. nur um das serialisieren von Daten, um diese zu speichern, gibt es einfachere und schnellere Möglichkeiten z.B. http://www.codeproject.com/KB/IP/fastJSON.aspx
Sehr schön das obige Beispiel. Geht das auch umgekehrt also bytearray to structure ?
tsag schrieb: > Sehr schön das obige Beispiel. > Geht das auch umgekehrt also bytearray to structure ? Warum sollte es nicht? Marshall.PtrToStructure http://msdn.microsoft.com/de-de/library/4ca6d5z7.aspx
Hallo Profis, habe versucht mit Marshal.PtrToStructure das Array tt in die Stuctur zu schreiben aber ich mach noch was falsch denn die werte in der Structure bleiben gleich. Kann mir jemand auf die Sprünge helfen Gruß und Danke
1 | arraytest.Point point1 = new arraytest.Point(); |
2 | point1.x = 5; |
3 | point1.y = 0xff; |
4 | point1.d = 55; |
5 | int structLen = Marshal.SizeOf(point1); |
6 | IntPtr ptr = Marshal.AllocHGlobal(structLen); |
7 | |
8 | byte[] dest = new byte[structLen]; |
9 | byte[]tt = new byte [structLen ]; |
10 | tt[0] = 4; |
11 | tt[1] = 0xff; |
12 | |
13 | tt[2] = 77; |
14 | tt[3] = 88; |
15 | Marshal.StructureToPtr(point1, ptr, false); |
16 | Marshal.Copy(ptr, dest, 0, structLen); |
17 | IntPtr Pointer = Marshal.AllocHGlobal(structLen); |
18 | //Marshal.Copy(tt, 0, Pointer, tt.Length);
|
19 | Marshal.PtrToStructure(Pointer,typeof(Point)); |
20 | Marshal.FreeHGlobal(ptr); |
Marshal.PtrToStructure(Pointer,typeof(Point)); liefert auch was zurück...in diesem Fall wäre das allerdings mehr oder weniger undefiniert siehe AllocHGlobal http://msdn.microsoft.com/en-us/library/s69bkh17.aspx PtrToStructure http://msdn.microsoft.com/de-de/library/4ca6d5z7.aspx
Guten Morgen, Wie kann man die Adresse von tt meinem Pointer übergeben? Vielen DAnk für Deine Geduld Schönen Tag
Ich blick es einfach nicht wie ich ein Array einem Zeiger übergeben kann. Sollte doch auch mit Marshallen funktionieren oder ? Ich Hoffe es erbarmt sich jemand und hilft mir. Vielen Dank im Voraus
Mit etwas mehr Kommentaren
1 | Point point1 = new Point() { x = 1234, y = 2345, d = 3.456, sepp = "45678" }; |
2 | int structLen = Marshal.SizeOf(point1); |
3 | byte[] dest = new byte[structLen]; |
4 | |
5 | // ptr zeigt auf den mit Alloc... reservierten Speicher
|
6 | IntPtr ptr = Marshal.AllocHGlobal(structLen); |
7 | // StructureToPtr copiert den Inhalt von point1 in den Speicher auf den ptr zeigt
|
8 | Marshal.StructureToPtr(point1, ptr, false); |
9 | // Copy kopiert das dann in das Array dest
|
10 | Marshal.Copy(ptr, dest, 0, structLen); |
11 | // tt ist das kopierte Array dest
|
12 | byte[] tt = dest; |
13 | // zum Test eine Änderung
|
14 | tt[1] = 0xff; |
15 | // den Inhalt von tt in den mit Alloc...reservierten Speicher zurück kopieren
|
16 | Marshal.Copy(tt, 0, ptr, structLen); |
17 | // und mit PtrToStructure in eine neue Struct packen
|
18 | Point point2 = (Point)Marshal.PtrToStructure(ptr, typeof(Point)); |
Gibt es nicht für so Struktur-nach-Array-und-zurück-Anwendungen nützliche Features wie Serialisierung etc.? Stichwort "BinaryFormatter"
Vielen vielen Dank!! Ich möchte mich herzlich für die Geduld Bedanken. Schönen Tag
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.