AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Binär ersetzen / binäre Suche

Ein Thema von blackdrake · begonnen am 15. Sep 2007 · letzter Beitrag vom 16. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Binär ersetzen / binäre Suche

  Alt 15. Sep 2007, 21:57
Hallo.

Ich möchte ein gewissen Binär-Suchmuster (mit enthaltenen 00h's) durch ein anderes Suchmuster der selben Länge in einer Datei ersetzen. Ich habe unter Google und hier in der Suche keine Funktion gefunden, die eine binäre Suche innerhalb einer Datei bzw. eines Streams durchführt. Da ich ein Muster mit der Länge x Byte durch ein Muster der Länge x Byte ersetzen möchte, besteht die Problematik nicht unbedingt beim Ersetzen, sondern bei dem Aufsuchen der Position(en) innerhalb des Streams. Hat jemand eine Idee, wie ich eine binäre Suche realisieren kann?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Binär ersetzen / binäre Suche

  Alt 15. Sep 2007, 22:07
Hi,

Suche nach einem Char? Das entspricht doch 00h bis FFh. Also denke ich, wenn man für den String ein einzelnes Char angiebt sollte s doch klappen. Hab ich aber so nicht getestet.

Ähm, oder doch? Hatte letztens #13 und #10 suchen und ersetzen lassen. Das sollte doch klappen. Die frage ist, ob man die Daten aus dem Stream in eine StringList bekommt.

Gruß oki
42
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Binär ersetzen / binäre Suche

  Alt 15. Sep 2007, 22:19
Hallo.

StringList? Wäre nicht sinnvoll, da die Datei zu 95% aus binären Zeichen besteht. Ich müsste die Datei in einen Stream laden. Und das Problem liegt darin, ein binäres Muster (sagen wir mal #00 #01 #02 #03 #04) zu suchen und zu ersetzen. Ich habe aber keine Ahnung, wie ich die Vorkommen dieses Musters innerhalb eines binären Streams ermitteln kann.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Binär ersetzen / binäre Suche

  Alt 15. Sep 2007, 22:25
ok, ich dachte du suchst die Übereinstimmung eines Bytes. Das wäre dann wie ein Char und mit StringReplace könnte mann es in einer Stringlist bearbeiten.

Dann denke ich, kannst du den Stream byte-weise lesen. erste Vorkommen 00h, merken, nächster muss 01h sein, wenn nicht Merker löschen ....

Ist der komplette Sucheintrag vorhanden, ersetzen. Das kann dann alles in einem Temp-Stream erfolgen.

Gruß oki
42
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Binär ersetzen / binäre Suche

  Alt 15. Sep 2007, 22:55
Hallo oki.

Danke für den Tipp. Erscheint zwar logisch, jedoch wäre diese Lösung

a) nicht dynamisch (da kein beliebiges Such/Ersatz-Muster angegeben werden kann. Jedoch ist mein Beispiel statisch)
b) ziemlich langsam, da die Datei ca. 1 MB groß ist.

Wenn man eine 1 MB große Datei byteweiße abgehen und die vorrangehenden Bytes auf das Suchmuster überprüfen würde, wäre das sehr uneffektiv. Gibt es keine bessere Lösung (z.B. eine solche, wie sie in Hex-Editoren bei der Ersatz-Funktion angewandt wird)? Die Methode des byteweisen Abtastens des Streams würde ich nur anwenden, wenn sich keine bessere Methode anbieten würde.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Binär ersetzen / binäre Suche

  Alt 15. Sep 2007, 23:09
Hi,

also was besseres fällt mir nicht ein. Dann muß wohl jemand anders ran. Assembler ist vielleicht ne Lösung.

Gruß oki
42
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Binär ersetzen / binäre Suche

  Alt 15. Sep 2007, 23:16
Moin Daniel,

lies die Datei doch mittels TFileStream in einen String ein, und ersetzte die Zeichen mit StringReplace.
Das müsste eigentlich funktionieren, und 1MB ist ja nun nicht sooo gross.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Binär ersetzen / binäre Suche

  Alt 16. Sep 2007, 01:27
Hallo.

Funktioniert leider nicht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  x: TFileStream;
  s: string;
begin
  x := TFileStream.Create('test.xyz', fmOpenReadWrite or fmShareDenyWrite);
  try
    x.Position := 0;
    setlength(s, x.Size-1);
    x.Read(s[1], x.Size-1);

    s := StringReplace(s, #$0E, #$7D, [rfReplaceAll]);

    x.Position := 0;
    x.Write(s[1], length(s))
  finally
    x.free;
  end;

  close;
end;
Es funktioniert, wenn ich eine Zeichenkette vom Anfang suche und ersetze. Wenn ich jedoch etwas suchen und ersetzen will, was vom Dateianfang durch ein Null-Byte (#00h) getrennt ist, passiert nichts.

12 34 56 0E 78 00 12 00 ... -> 12 34 56 7D 78 00 12 00 (OK)
12 34 56 88 78 00 0E 00 ... -> 12 34 56 88 78 00 0E 00 (Fehler)

Scheinbar arbeitet StringReplace() intern mit PChar's, was dazu führen könnte, dass #00h's als Schlussbegrenzung angesehen werden. Dadurch ist StringReplace() scheinbar nicht Binary-Safe, obwohl Strings von Grund auf Binary-Safe sind. Oder hab ich was falsch gemacht?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Binär ersetzen / binäre Suche

  Alt 16. Sep 2007, 01:39
sowas wird byteweise gemacht.
Wenn du beispielsweise nach
12 34 56 0E 78 00 12 00
suchst gehst du byteweise alles durch bis du
12
gefunden hast.
Wenn du ein 12 gefunden hast schaust du ob danach ein 34, dann ein 56 etc. kommt. Wenn dann irgendwas nicht mehr stimmt musst du an der stelle wo du die 12 (erstes zeichen) gefunden hast wieder nach der nächsten 12 suchen.

Soviel zur Theorie. Die Praxis sollte jeder Programmierer selbst hinnbekommen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Binär ersetzen / binäre Suche

  Alt 16. Sep 2007, 03:24
Moin Daniel,

ich hab' mal in die Sourcen geschaut.
Leider verwendet StringReplace AnsiPos, das wiederum AnsiStrPos und somit, wie Du schon sagtest, PChar, verwendet

In Deinem Falle müsste das aber mit Pos und PosEx lösbar sein.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:35 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