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: () )