AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Datei binär auslesen (Delhpi 7)

Ein Thema von Captnemo · begonnen am 23. Mai 2016 · letzter Beitrag vom 23. Mai 2016
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 16:56
Hi,

ich versuche gerade eine DB-Datei binär auszulesen.
Mit dem Header hat das soweit auch gut geklappt. Nur mit den Daten habe ich ein Problem (was sicherlich zwischen meinen Ohren sitzt).

Hier mal ein bisschen Code:

Delphi-Quellcode:
  TDatenArray = array of Byte;

.
.
.
Procedure DatenAuslesen(fs: TFileStream);
var
  fieldcount: Integer;
  EndOfFields: Boolean;
  i, f, d: Integer;
  c: Integer;
  Feldname: string;
  daten: TDatenArray;
  fieldbytes: Integer;
  fieldoffset: Integer;
  fieldtext: string;
  newposition: Integer;
  bytesread: Integer;
begin


  //Hier passieren noch einige Dinge
  //Alle unten aufgeführten Vars werden initialisiert
  //Zur Demo setzt ich notwenige Daten direkt

  Datasize=1607;

  SetLength(daten, DataSize);
  //Setze Zeiger auf ersten Datensatz
  newposition:=fs.Seek(DataOffset, soFromBeginning);
  for i:=0 to 100 do begin //Alle Datensätze durch gehen (erstmal nur die ersten 100)
    bytesread:=fs.Read(daten, DataSize);
    fieldoffset:=0;
    if bytesread=DataSize then begin
      for f:=1 to 10 do begin //Alle Felder durchgehen (erstmal nur die ersten 10)
        fieldbytes:=StrToInt(sg_tabellenstructur.Cells[2, f]);
        fieldtext:='';
        case StrToInt(sg_tabellenstructur.Cells[5, f]) of
          67: begin
                for d:=0 to fieldbytes-1 do
                  fieldtext:=fieldtext+chr(daten[d+fieldoffset]); //Hier tritt ein Fehler Zugriffsverletzung auf. d ist dann 0 und fieldoffset ist 40.
              end;
        end;
        sg_Daten.Cells[f, i+1]:=fieldtext;
        fieldoffset:=fieldoffset+fieldbytes;
      end;
    end else Exit;
  end;
end;
Mir ist nicht klar, warum hier eine Zugriffsverletzung auftreten kann.

Ich habe den Code mal soweit eingekürzt, damit nichts unnötiges hier steht. Laut Bytesread müssten doch exakt soviel Bytes gelesen worden sein, dass das Daten-Array entsprechend gefüllt ist. Und wenn das Daten-Array nicht vorhanden wäre, dann müsste ja schon die read-operation fehlschlagen. Der Debugger zeigt mir nach der SetLength-Funktion auch das Array entsprechend an (Angezeigt wird: (0,0,0,0,0,....) ), aber nach read-Funktion sieht es im Debugger so aus, als hätte das Array eine länge von 0 (Angezeigt wird: () )
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#2

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:05
Ich bin mir fast sicher, dass Delphi 7 noch kein TStream.Read mit TBytes-Parameter kennt,
als fs.Read(daten, DataSize); => fs.Read(daten[0], DataSize); , denn du willst ja den Array-Inhalt und nicht den Array-Zeiger überschreiben, da der Compiler bestimmt die Variante mit dem offenen VAR-Parameter verwendet.

http://docwiki.embarcadero.com/Libra...s.TStream.Read
http://docwiki.embarcadero.com/VCL/2...s.TStream.Read
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Mai 2016 um 17:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#3

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:19
Naja, beim Header klappt's ja ganz gut


Delphi-Quellcode:
TDBHeader = array[0..31] of Byte;
.
.
.
  TForm1 = class(TForm)
  .
  .
  private
    inputFS: TFileStream;
    DBHeader: TDBHeader;
  .
  .
  end;
.
.
.
.
procedure TForm1.GetHeader(fs: TFileStream);
begin
  fs.Read(DBHeader, SizeOf(DBHeader));
end;
Der einzige Unterschied den ich sehe ist, dass ihr hier ein statisches Array habe.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#4

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:26
Der Header ist aber auch ein statisches Array und das ist wie ein Record.
Ein dynamisches Array ist aber ein Pointer, der dann auf den Arrayinhalt zeigt.
Und ohne Dereferenzierung schreibst du dann in den Pointer und nicht in die Daten.

Beim Statischen sind die Daten dagegen direkt in der Variable drin.

SizeOf(Daten) = 4
SizeOf(DBHeader) = mehr
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Mai 2016 um 17:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#5

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:28
Ahhhh.....dann verstehe ich das.

Danke.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#6

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:31
Darum am Besten immer Dereferenzieren, egal ob statisch oder dynamisch ... da kann dann nie was schief gehen.

Entweder Datan[Low(Daten)] oder du sagst "bei mir beginnt Statisches immer bei 0", dann Datan[0] .
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:36
Wenn Du auch dynamische Arrays nutzt, dann gewöhn Dir z.B. fs.read(meinarray,anzahl); ganz schnell ab und mach es so fs.read(Meinarray[low],anzahl); Das geht soweit ich weiß bei statischen und Dynamischen Arrays und funktioniert dann immer.
(also immer wenn Du auf ein Array zugreifen willst, nur über den Index gehen)

Gruß
K-H

Edith:
seit wann low(MeinArray) ? Ich kenn es nur ohne Angabe des Arrays.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (23. Mai 2016 um 17:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#8

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:38
Ich brauch doch noch etwas Unterstützung bei der Umsetzung.

Wenn ich das so mache:

Delphi-Quellcode:
PDatenArray = Array of Byte;
TDAtenArray = ^PDatenArray;

procedure ....
var
  Daten = TDatenArray;
begin
  Datasize=1607;

  SetLength(Daten^,Datasize);
.
.
.
.
end;
Dann knallt es bei SetLength.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#9

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:39
Wenn Du auch dynamische Arrays nutzt, dann gewöhn Dir z.B. fs.read(meinarray,anzahl); ganz schnell ab und mach es so fs.read(Meinarray[low],anzahl); Das geht soweit ich weiß bei statischen und Dynamischen Arrays und funktioniert dann immer.
(also immer wenn Du auf ein Array zugreifen willst, nur über den Index gehen)

Gruß
K-H
Das werde ich auch mal ausprobieren. Aber wenn ich das richtig verstanden habe kommt beides auf's gleiche raus.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Datei binär auslesen (Delhpi 7)

  Alt 23. Mai 2016, 17:39
setlength(Daten,AnzahlElemente); Gruß
K-H

Das werde ich auch mal ausprobieren. Aber wenn ich das richtig verstanden habe kommt beides auf's gleiche raus.
korrekt!
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz