PC-Programmierung
›
Thread
C# Marshal.Structure
DD
der der auf dem Schlauch steht
Gast
22.05.2011 11:37
#2193774
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
DD
der der auf dem Schlauch steht
Gast
22.05.2011 12:05
#2193790
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
AN
Arc N.
(arc)
22.05.2011 14:25
#2193937
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...
DD
der der auf dem Schlauch steht
Gast
22.05.2011 16:09
#2194024
Vielen Dank für deine Hilfe.
Ist diese Vorgens weise sinnvoll oder hat das Marshalen Nachteile?
AN
Arc N.
(arc)
22.05.2011 17:01
#2194094
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
T
tsag
Gast
22.05.2011 20:48
#2194366
Sehr schön das obige Beispiel.
Geht das auch umgekehrt also bytearray to structure ?
AN
Arc N.
(arc)
22.05.2011 22:43
#2194512
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
T
tsag
Gast
23.05.2011 21:05
#2195633
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 );
AN
Arc N.
(arc)
24.05.2011 00:13
#2195916
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
T
tsag
Gast
24.05.2011 05:56
#2195978
Guten Morgen,
Wie kann man die Adresse von tt meinem Pointer übergeben?
Vielen DAnk für Deine Geduld
Schönen Tag
T
tsag
Gast
24.05.2011 21:04
#2197106
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
AN
Arc N.
(arc)
25.05.2011 14:29
#2197993
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"
T
tsag
Gast
26.05.2011 07:10
#2198835
Vielen vielen Dank!!
Ich möchte mich herzlich für die Geduld Bedanken.
Schönen Tag
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren