AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Warum funktioniert das nicht? Suchen in einer Datei...

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

Ein Thema von BBoy · begonnen am 17. Jul 2013 · letzter Beitrag vom 18. Jul 2013
Antwort Antwort
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, 15: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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.286 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 17. Jul 2013, 17:16
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
BBoy

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

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

  Alt 17. Jul 2013, 17:53
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;

Geändert von BBoy (17. Jul 2013 um 18:30 Uhr)
  Mit Zitat antworten Zitat
BBoy

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

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

  Alt 17. Jul 2013, 19:54
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!!
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#5

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

  Alt 17. Jul 2013, 22:03
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).

Stream.Read(Buffer[0], SizeOf(Buffer)); // SizeOf(Buffer) = 4 !!!
Mach es vielleicht mal so:
Stream.Read(Buffer[0], Length (Buffer));

Zitat:
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ß
Volker Zeller
  Mit Zitat antworten Zitat
BBoy

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

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

  Alt 18. Jul 2013, 06:53
Hallo,
Stream.Read(Buffer[0], SizeOf(Buffer)); // SizeOf(Buffer) = 4 !!! Mach es vielleicht mal so:
Stream.Read(Buffer[0], Length (Buffer)); Gruß
Wie doof von mir. Nun funktioniert es.
Danke!
Aber warum ist SizeOf(Buffer) = 4 ?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 18. Jul 2013, 08:01
Weil das die Größe der Datenstruktur zur Verwaltung ist. Und das ist ein 32-bit Pointer = 4 Bytes.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
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 09:52 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