chlorbeere
Goto Top

Wie schreibt man ein Structure mit UShort() in ein Byte()

Hallo!
Richtig gute Plattform! Gefällt mir! Aber jetzt muss ich doch etwas fragen. Ich komme einfach nicht weiter.
Gesucht habe ich auch schon. Ich hab eauch schon allerhand ausprobiert und eine "Notlösung" habe ich auch schon. Aber ich wollte wissen, ob es nicht vielleicht eine elegantere Methode gibt.

Zu meinem Problem:
Ich habe eine *.dat, wo Informationsdaten von Satelliten drin stehen. Diese Datei ist im littleEndian gespeichert, und hat kein Alignment.

Das Struture sieht so aus:
Public Structure Satelliteentry
        Dim ID As UInt32  '32bit  
        Dim Unknown_1 As UInt32 '32bit  
        Dim Name As UShort() '16bit unsigned 64er array  
        Dim EastWest As UInt32 '0=west, 1=east, 2=undefined  
        Dim Position As UInt32 'Position in 0.1 Gradschritten  
End Structure

Ich habe noch ein anderes Struture wo nur! UInt32 drin ist, und kein Array von diesem Datentyp. Also kein UInt32() oder so.
Das habe ich bisher immer so erfolgreich geschrieben:
Private Function Structure_To_Bytearray(ByVal Input As Object) As Byte()

        Dim Size_Input As Integer = Marshal.SizeOf(Input) 'Größe des Outputs bestimmen  

        Dim Output(Size_Input - 1) As Byte 'Outputarray dimensionieren  
        Dim Ptr As IntPtr = Marshal.AllocHGlobal(Size_Input) 'Speicherplatz für Struc umwandlung reservieren mit Pointer auf Speicherplatz  

        'Structure umwandeln  
        Marshal.StructureToPtr(Input, Ptr, False)
        Marshal.Copy(Ptr, Output, 0, Marshal.SizeOf(Input)) 'Structure in Speicher kopieren  
        Marshal.FreeHGlobal(Ptr) 'Zeiger wieder freigeben  
        Return Output 'Array zurückgeben  

End Function

Aber das funktioniert leider nicht mit dem obigen Struct.
Ich habe es jetzt so gelöst, dass ich jeden Datentyp aus dem Struct einzeln aufrufe und ihn manuell mit einem BinaryWriter schreibe. Aber das ist irgendwie blöde, zumal ich noch ein Struct brauche was auch arrays hat und sehr viel umfangreicher ist. Dann wird das sehr unübersichtlich.

Ich habe den Verdacht, dass der mit dem anderen Datentyp UShort da nicht zurandekommt und das ganze auch noch als Array vorliegt.
Die Größe wird auch nicht richtig berechnet. Ich habe da den Verdacht, dass er nur die Größe von ID, Unknown_, EastWest und Position kriegt, aber die Größe von Name als UShort() unter den Tisch fallen lässt.

Könnt ihr mir helfen?
Würde mich tierisch freuen.

Grüße
Chlorbeere

Content-Key: 216995

Url: https://administrator.de/contentid/216995

Ausgedruckt am: 29.03.2024 um 01:03 Uhr

Mitglied: aqui
aqui 14.09.2013 um 12:32:28 Uhr
Goto Top
..."Struture" ?? Für sowas gibts immer den "Bearbeiten" Button !!
Mitglied: colinardo
colinardo 14.09.2013 um 13:24:48 Uhr
Goto Top
Hi Chlorbeere,
da sollte Dir ein BinaryFormatter weiterhelfen:
http://www.vb-magazin.de/forums/forums/t/1411.aspx

Grüße Uwe
Mitglied: Chlorbeere
Chlorbeere 14.09.2013 aktualisiert um 15:10:24 Uhr
Goto Top
Hi!
Jo danke für den Tipp, aber das habe ich schon probiert.
Das Problem besteht darin, dass mein Fernseher dieses *.dat File auch noch lesen muss. Und das geht nur, wenn exakt der Inhalt der jeweiligen Einträge im Struct exakt so in die Datei geschrieben werden.
Wenn ich das durch den Bin_Formatter jage, dann kommt zwar das Struct als Byte() heraus, aber leider in einem anderen "Format". Keine Ahnung wie ich das nennen soll? Oder ich habe den Binary Formatter nicht verstanden. Bzw. benutze ihn noch nicht richtig.

Mir würde es helfen, wenn ich wüsste, wie ich dem Marshal.StructureToPtr sagen könnte:
Schreibe 32 bit mit dem Inhalt von ID, dann direkt dahinter 32 bit von Unknown_1, und dann bitte 64 mal UInt16 mit dem Inhalt von Name...
Das was er macht, ist, dass er anscheinend die UInt16 als UInt32 oder so interpretiert und dass dann irgendwie als Byte() exportiert...
Mitglied: Chlorbeere
Chlorbeere 14.09.2013 um 14:11:37 Uhr
Goto Top
Hi!
Hmm, verstehe ich nicht. Was meinst du mit "Bearbeiten"?
Mitglied: colinardo
colinardo 14.09.2013 aktualisiert um 15:08:55 Uhr
Goto Top
Hmm, verstehe ich nicht. Was meinst du mit "Bearbeiten"?
@aqui meint das du deine Rechtschreibfehler im Titel korrigierst, mit der Bearbeiten-Funktion des Beitrags.

Grüße Uwe
Mitglied: Chlorbeere
Chlorbeere 14.09.2013 um 15:08:58 Uhr
Goto Top
Hi!
Ok. Ich hab herausgefunden, dass der nichts mit dem Typ UShort anfangen kann.
Aber wie man jetzt solche Sachen Marshallen kann übersteigt mein derzeitiges Können leider ein wenig.

Aber dennoch danke!

@aqui: Sorry hab ich nicht gesehen. Werde ich korrigieren.