Einzelnen Beitrag anzeigen

BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Warum funktioniert das nicht? Suchen in einer Datei...

  Alt 17. Jul 2013, 14:46
Ich möchte in einer Binärdatei nach einem bestimmten vorkommen suchen und dann den 8byte Wert nach diesem Vorkommen auslesen und verarbeiten.
Das Suchen nach dem Vorkommen ist kein Problem, es wird gefunden und ich lese die 8 folgenden bytes aus und speichere sie in einer listbox. Dann sucht das Programm weiter.
Nun habe ich aber die Ergebnisse in der Listbox mit einem Hexeditor überprüft und festgestellt das die werte mal stimmen und mal nicht. Also die ersten 5 Werte stimmen, dann 2 wieder nicht usw... Die Werte unterscheiden sich meist nur an einer Stelle.
Ich habe den Eindruck als würden bestimmte Zeichen aus der Datei falsch interpretiert.
Aus dem Wert
3B 70 CE 88 D2 3E 21 40
wird
3B 70 CE 2C 6D 23 E2 21 40

Aus dem Wert
74 46 94 F6 06 3F 21 40
wird
74 46 20 1D F6 06 3F 21 40

Das Verstehe ich nicht. Weiß jemand von euch woran das liegen könnte? Wie kann ich den Code noch optimieren?


Delphi-Quellcode:
function Tform3.searching(fname: string) : integer;
var
 MS:TmemoryStream;
 p1:Cardinal;
 Search : AnsiString;
 index : Integer;
 anzahl : Integer;
 lon,lat : String;
 Tempstr : String;
 i : Byte;
begin
  MS := TMemoryStream.Create;
  try
   lon := '';
   lat:= '';
    MS.LoadFromFile(fname);
    SetString(Search,PansiChar(MS.Memory),MS.Size);
    p1 := 0;
    anzahl := 0;
    p1 := Pos(AnsiString('tude'), Search);
    if p1 <> 0 then begin
      inc(anzahl);
      tempstr := copy(search,p1+6,8);
      for i := 1 to 8 do
        lon := lon + IntToHex(Ord(tempstr[i]), 2);
      listbox1.Items.Add(lon);
    end;
    index := p1+4;

    while p1 <> 0 do begin
       lon := '';
       lat:= '';

    p1 := PosEx(AnsiString('longitude'), Search, index);

    if p1 <> 0 then begin
      inc(anzahl);
      tempstr := copy(search,p1+6,8);
      for i := 1 to 8 do
        lon := lon + IntToHex(Ord(tempstr[i]), 2);
      listbox1.Items.Add(lon);
    end;
    index := p1+4;
  end;
  finally
    MS.Free;
  end;
  result := anzahl;
end;
Vielen Dank!!
  Mit Zitat antworten Zitat