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:
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:
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
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 216995
Url: https://administrator.de/contentid/216995
Printed on: April 27, 2024 at 00:04 o'clock
6 Comments
Latest comment
Hi Chlorbeere,
da sollte Dir ein BinaryFormatter weiterhelfen:
http://www.vb-magazin.de/forums/forums/t/1411.aspx
Grüße Uwe
da sollte Dir ein BinaryFormatter weiterhelfen:
http://www.vb-magazin.de/forums/forums/t/1411.aspx
Grüße Uwe
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