Laden...

[gelöst] Random-Access Datei (erstellt in Power Basic) Einleseprobleme

Erstellt von oehrle vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.415 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 9 Jahren
[gelöst] Random-Access Datei (erstellt in Power Basic) Einleseprobleme

Hallo, ich kämpfe schon seit gestern mit einer Datei die in Powerbasic das in der MS-DOS-Konsole läuft, erstellt wurde.
Die Datei wird als Bytestream abgelegt.

Der Mann der das Projekt noch betreut, hat mir gesagt wie die Datei aufgebaut ist.

Eine Datenzeile oder ein Datensatz besteht aus 136 Byte, dazu folgende Aufschlüsselung:

1.Feld: 10 Byte (Typ: Integer)
2.Feld: 10 Byte (Typ: Integer)
.
.
4. Feld: 10 Byte (Typ: Integer)
5. Feld: 8 Byte (Typ: Double)
6. Feld: 8 Byte (Typ: Double)
.
.
.
16. Feld: 8 Byte (Typ: Double)

In allen Felder sind Zahlenwerte abgelegt.
Die ersten 1000 Datenzeilen sind leer, kann ich komplett einlesen.

Ab der 1001 Zeile kommen Werte, die ersten 4 Spalten kommen auch korrekt:
Feld.Spalte:
1001.0 ==> 1001 (Zahlenwert 1001 OK)
1001.1 ==> 1001 (Zahlenwert 1001 OK)
1001.2 ==> null (kein WErt vorhandne, also "NULL" OK)
1001.3 ==> 1 (Zahlenwert 1 OK)
1001.4 ==> "\0\0\0\0\0b@" (Zahlenwert sollte 148,00000 sein, kommt aber dieses kryptische Ding an)
1001.4 ==> "\0\0@33ó?" (Zahlenwert sollte 1,200000 sein, kommt aber dieses kryptische Ding an)

Wieso bekomme ich das Zeug nicht komplett richtig, oder was mache ich falsch?
Kann mir jemand ein Tipp geben?
Evtl. ist das was bitmäßig verschoben?

Hier mal mein Code für die Auswertung:


  string datenSatz = null;

            List<byte[]> lByteArray = null;
            List<string> lDatensätze = new List<string>();

            string pfadScheibendatei = @"c:\ablageordner\wheels.neu";


            using (FileStream fs = new FileStream(pfadScheibendatei, FileMode.Open, FileAccess.Read))
            {
                using (BinaryReader bn = new BinaryReader(fs))
                {

                    while (bn.PeekChar() != -1)
                    {
                        lByteArray = new List<byte[]>();
                        try
                        {
                            //// Ab 1000. Datensatz kommen Daten, deshalb ab diesem Datensatz debuggen (Einsprung)
                            if (lDatensätze.Count == 1000)
                            {
                                
                            }

                            lByteArray.Add(bn.ReadBytes(10));
                            lByteArray.Add(bn.ReadBytes(10));
                            lByteArray.Add(bn.ReadBytes(10));
                            lByteArray.Add(bn.ReadBytes(10));

                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));
                            lByteArray.Add(bn.ReadBytes(8));


                            string datenSpalte = null;

                            //// Alle Einträge in der List<> nacheinander durchgehen und die Feldwerte zusammenstellen
                            for (int a = 0; a < lByteArray.Count; a++)
                            {
                                datenSpalte = null;
                                foreach (Byte byteWert in lByteArray[a])
                                    datenSpalte += Convert.ToChar(byteWert);

                                datenSatz += datenSpalte;
                            }
                        }
                        catch (OverflowException ex)
                        {

                        }
                        catch (Exception ex)
                        {

                        }


                        try
                        {
                            //// Datensatz der List<> zufügen, wenn Daten vorhanden sind
                            if (datenSatz.Trim() != "")
                                lDatensätze.Add(datenSatz);
                            
                        }
                        catch (OverflowException ex)
                        {

                        }
                        catch (Exception ex)
                        {

                        }
                    }
                }

            }

            return;

Habe die Datei gezippt und angehängt. Da bin ich mal gespannt, ob mir dabei jemand einen guten Tipp geben kann.

Ach: Hier noch ein Link zu PowerBasic mit dem Befehl MKD, der verwendet wird. Evtl. gibt das noch irgend welche Aufschlüssen.
PowerBasic MKD$

4.931 Beiträge seit 2008
vor 9 Jahren

Hallo,

die double-Werte sind wohl binär gespeichert, so daß du diese mittels


double d = BitConverter.ToDouble(bytes, index);

erhalten kannst (s. BitConverter.ToDouble).

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 9 Jahren
GelÖst

Danke für die Info, hat gepasst.