![]() |
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:
Vielen Dank!!
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; |
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. |
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; |
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:
Das oben dient nur zum testen. Das Ergebnis:
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; 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!! |
AW: Warum funktioniert das nicht? Suchen in einer Datei...
Hallo,
Zitat:
Zitat:
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:
Gruß |
AW: Warum funktioniert das nicht? Suchen in einer Datei...
Zitat:
Danke! Aber warum ist SizeOf(Buffer) = 4 ? |
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