Forum: PC-Programmierung C# Marshal.Structure


von der der auf dem Schlauch steht (Gast)


Lesenswert?

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

von der der auf dem Schlauch steht (Gast)


Lesenswert?

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

von Arc N. (arc)


Lesenswert?

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...

von der der auf dem Schlauch steht (Gast)


Lesenswert?

Vielen Dank für deine Hilfe.
Ist diese Vorgens weise sinnvoll oder hat das Marshalen Nachteile?

von Arc N. (arc)


Lesenswert?

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

von tsag (Gast)


Lesenswert?

Sehr schön das obige Beispiel.
Geht das auch umgekehrt also bytearray to structure ?

von Arc N. (arc)


Lesenswert?

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

von tsag (Gast)


Lesenswert?

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);

von Arc N. (arc)


Lesenswert?

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

von tsag (Gast)


Lesenswert?

Guten Morgen,
Wie kann man die Adresse von tt meinem Pointer übergeben?


Vielen DAnk für Deine Geduld


Schönen Tag

von tsag (Gast)


Lesenswert?

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

von Arc N. (arc)


Lesenswert?

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));

von Sven H. (dsb_sven)


Lesenswert?

Gibt es nicht für so Struktur-nach-Array-und-zurück-Anwendungen 
nützliche Features wie Serialisierung etc.?

Stichwort "BinaryFormatter"

von tsag (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.