Einzelnen Beitrag anzeigen

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, 15: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