Byte(array) in Struct wandeln

21/03/2009 - 12:03 von Stefan | Report spam
Hallo,

ich lese mit VB.NET eine Datei ein die mit einen PDS Basic DOS-Programm
geschrieben wird.
Gespeichert werden Datensàtze (TYPE bzw.Struct)
Das Einlesen funktioniert auch, ist allerdings für die Grösse der Datei sehr
langsam. (521kb in 3 Sekunden)
Das Hinzufügen zur Collection veràndert kaum die Laufzeit.
Dim Journalsatz As struct_Journal = New struct_Journal
FileOpen(1, Form_Main.Pfad & "\001_jour.fib", OpenMode.Random,
OpenAccess.Read, OpenShare.Shared, Len(Journalsatz))
For i As Integer = LOF(1) / Len(Journalsatz) To 1 Step -1
FileGet(1, Journalsatz, i)
Form_Main.Historie.Add(Journalsatz)
Next
FileClose(1)

Nun làsst sich die Datei so blitzschnell in den Speicher laden:
Dim value As Byte() = My.Computer.FileSystem.ReadAllBytes(Form_Main.Pfad &
"\001_jour.fib")

Wie bekomme ich aber nun die Werte aus dem Array in den Journalsatz?
Erste Tests ergeben Laufzeitfehler (Zugriff auf geschützten Speicherbereich)
beim PtrToStructure.

Dim xx As Byte()
ReDim xx(Len(Journalsatz))
Array.Copy(value, xx, Len(Journalsatz))
Dim MyGC As GCHandle = GCHandle.Alloc(xx, GCHandleType.Pinned)
Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject,
Journalsatz.GetType)

Wie kann ich den Laufzeitfehler vermeiden?

Gruß
Stefan
 

Lesen sie die antworten

#1 Armin Zingler
21/03/2009 - 13:34 | Warnen spam
Stefan wrote:
Hallo,

ich lese mit VB.NET eine Datei ein die mit einen PDS Basic
DOS-Programm geschrieben wird.
Gespeichert werden Datensàtze (TYPE bzw.Struct)
Das Einlesen funktioniert auch, ist allerdings für die Grösse der
Datei sehr langsam. (521kb in 3 Sekunden)
Das Hinzufügen zur Collection veràndert kaum die Laufzeit.
Dim Journalsatz As struct_Journal = New struct_Journal
FileOpen(1, Form_Main.Pfad & "\001_jour.fib", OpenMode.Random,
OpenAccess.Read, OpenShare.Shared, Len(Journalsatz))
For i As Integer = LOF(1) / Len(Journalsatz) To 1 Step -1
FileGet(1, Journalsatz, i)
Form_Main.Historie.Add(Journalsatz)
Next
FileClose(1)

Nun làsst sich die Datei so blitzschnell in den Speicher laden:
Dim value As Byte() > My.Computer.FileSystem.ReadAllBytes(Form_Main.Pfad & "\001_jour.fib")



Warum verwendet ihr gerade das Zeugs aus My.*, das da nicht hingehört weil
es designtechnisch völliger Blödsinn und noch dazu redundant ist (da bereits
schon vorher im Framework vorhanden)? My ist bestenfalls für Inhalte des
eigenen Projekts zustàndig, z.B. My.Ressources. Aber My.Computer und vieles
andere gehört da überhaupt nicht hin. Sind sowieso alles statische Member
oder sollten es sein (oder gibt's etwa noch ein andersartiges ReadAllBytes
für My.Sisters.Computer?). Ich rate dringend von der Verwendung dieses
missratenen Namespaces ab! Verwende stattdessen System.IO.File.ReadAllBytes,
denn die Funktion wird von "meinem Computer" ohnehin aufgerufen.

Zum Thema:
Wie bekomme ich aber nun die Werte aus dem Array in den Journalsatz?
Erste Tests ergeben Laufzeitfehler (Zugriff auf geschützten
Speicherbereich) beim PtrToStructure.

Dim xx As Byte()
ReDim xx(Len(Journalsatz))

Array.Copy(value, xx, Len(Journalsatz))
Dim MyGC As GCHandle = GCHandle.Alloc(xx, GCHandleType.Pinned)
Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject,
Journalsatz.GetType)

Wie kann ich den Laufzeitfehler vermeiden?



evtl. genügt schon
ReDim xx(Len(Journalsatz) - 1)

Oder auch
ReDim xx(Marhshal.sizeof(Journalsatz) - 1)

Hast du die Structure Journalsatz mit den entsprechenden Interop-Attributen
(MarshalAs) deklariert?

Wie ist denn die Structure deklariert? Bist du sicher, dass der binàre
Aufbau des Satzes aus der Datei mit dem binàren Aufbau der verwalteten
Structure übereinstimmt?


Armin

Ähnliche fragen