Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Warum funktioniert das nicht? Suchen in einer Datei... (https://www.delphipraxis.net/175776-warum-funktioniert-das-nicht-suchen-einer-datei.html)

BBoy 17. Jul 2013 14:46

Warum funktioniert das nicht? Suchen in einer Datei...
 
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!!

jaenicke 17. Jul 2013 16:16

AW: Warum funktioniert das nicht? Suchen in einer Datei...
 
Das ist ein Encoding Problem. Wenn du aus einer Binärdatei (umgangssprachlich für "keine Textdatei" nehme ich an) Bytes auslesen willst, sind Strings denkbar ungeeignet.
Du kannst z.B. ein TArray<Byte> benutzen, je nachdem was du machen willst.

Auch die Suche über einen String ist nicht empfehlenswert bei einer Binärdatei.

BBoy 17. Jul 2013 16:53

AW: Warum funktioniert das nicht? Suchen in einer Datei...
 
Danke!

habe es jetzt so umgesetzt: Aber wie kann ich darin suchen nach z.B. "text" oder FFD234E1 ?

Delphi-Quellcode:
var
Stream: TFileStream;
Buffer: array of byte;
TempStr: string;
i: Integer;
begin
  Memo1.Clear;
  Stream := TFileStream.Create('1.tcq', fmOpenRead);
  SetLength(Buffer, stream.Size);
  try
    Stream.Read(Buffer[0], SizeOf(Buffer));
  finally
    Stream.Free;
  end;
  memo1.Lines.Add(inttohex(buffer[0],2));
end;

BBoy 17. Jul 2013 18:54

AW: Warum funktioniert das nicht? Suchen in einer Datei...
 
Ich habe das nun mal so versucht aber komischerweise kann man nur die ersten 4 byte anzeigen lassen.
Delphi-Quellcode:
var
Stream: TFileStream;
i: Integer;
bsize : int64;
begin
  Memo1.Clear;
  Stream := TFileStream.Create('1.tcj', fmOpenRead);
  bsize := stream.Size;
  SetLength(Buffer, bsize);
  Stream.Read(Buffer[0], SizeOf(Buffer));
  // Nur zum test
  memo1.Lines.Add(inttohex(buffer[0],2));
  memo1.Lines.Add(inttohex(buffer[1],2));
  memo1.Lines.Add(inttohex(buffer[2],2));
  memo1.Lines.Add(inttohex(buffer[3],2));
  memo1.Lines.Add(inttohex(buffer[4],2));
  memo1.Lines.Add(inttohex(buffer[5],2));
  memo1.Lines.Add(inttohex(buffer[6],2));
  memo1.Lines.Add(inttohex(buffer[7],2));
  memo1.Lines.Add(inttohex(buffer[8],2));
  memo1.Lines.Add(inttohex(buffer[9],2));
  memo1.Lines.Add(inttohex(buffer[10],2));
  memo1.Lines.Add(inttohex(buffer[11],2));

  for i := 0 to bsize do begin
    if (buffer[i]=$43) and (buffer[i+1]=$37) and (buffer[i]=$F2) then begin // diese Daten kommen definitiv vor in der Datei!!
      memo1.Lines.Add('--'); // dient nur als kontrolle ob was gefunden wurde
    end;
  end;
  label1.Caption := inttostr(i);
  Stream.Free;
end;
Das oben dient nur zum testen. Das Ergebnis:
02
0A
53
59
00
00
00
00
00
00
00
00
Es sind aber keine 00 sondern andere Werte in der Datei.
Mit der Ausgabe im Label habe ich getestet ob die gesamte Datei mit der schleife durchlaufen wird. das wird sie! Verstehe das nicht.

wäre echt nett wenn mir jemand weiter helfen könnte. Event. auch mit Code. Danke!!

Volker Z. 17. Jul 2013 21:03

AW: Warum funktioniert das nicht? Suchen in einer Datei...
 
Hallo,

Zitat:

[...] komischerweise kann man nur die ersten 4 byte anzeigen lassen
Na, wenn Du nur die ersten vier Byte einließt, dann können kaum mehr gültige Werte in Deinem Array stehen
Zitat:

Es sind aber keine 00 sondern andere Werte in der Datei
In der Datei schon - in Deinem Array stehen die Nullen aber schon drin (SetLength).

Delphi-Quellcode:
Stream.Read(Buffer[0], SizeOf(Buffer)); // SizeOf(Buffer) = 4 !!!

Mach es vielleicht mal so:
Delphi-Quellcode:
Stream.Read(Buffer[0], Length (Buffer));


Zitat:

Delphi-Quellcode:
if (buffer[i]=$43) and (buffer[i+1]=$37) and (buffer[i]=$F2) then begin // diese Daten kommen definitiv vor in der Datei!!

Sicher nicht!! Kuck mal genau hin.

Gruß

BBoy 18. Jul 2013 05:53

AW: Warum funktioniert das nicht? Suchen in einer Datei...
 
Zitat:

Zitat von Volker Z. (Beitrag 1221881)
Hallo,
Delphi-Quellcode:
Stream.Read(Buffer[0], SizeOf(Buffer)); // SizeOf(Buffer) = 4 !!!
Mach es vielleicht mal so:
Delphi-Quellcode:
Stream.Read(Buffer[0], Length (Buffer));
Gruß

Wie doof von mir. Nun funktioniert es.
Danke!
Aber warum ist SizeOf(Buffer) = 4 ?

Union 18. Jul 2013 07:01

AW: Warum funktioniert das nicht? Suchen in einer Datei...
 
Weil das die Größe der Datenstruktur zur Verwaltung ist. Und das ist ein 32-bit Pointer = 4 Bytes.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz