![]() |
Stringreplace mit einer unbekannten
Hi, ich möchte einen string erstzen der aus vier bytes und einem unbekannten besteht.
Nun hab ich schon einiges probiert aber irgendwie komme ich zu keinem vernünftigen ergebnis.
Delphi-Quellcode:
var
s : string; begin Form3.Memo1.Text:=StringReplace(Form3.Memo1.Text,'3B 00 01 00 ' + (s,1),'3B 00 01 00 02',[rfReplaceAll, rfIgnoreCase]); end; |
Re: Stringreplace mit einer unbekannten
Hi!
Ich glaube wir müssen erstmal über Grundlegendes reden. :) Was für einen Text hast du denn da? Sieht er aus, wie oben in deinem Beispiel, also so
Code:
oder stehen die Bytes wirklich in deinem Text
3B 00 1A FF 34 82
Code:
?
;
Falls letzteres zutrifft, musst du dir erstmal eine anderen Typ außer "String" suchen (z.B. array of byte) da ein String immer nur bis zum nächste 0-Byte geht. Falls ersteres zutrifft, müßtest du nach den ersten 4 Byte suchen und dir deren Position merken (siehe Hilfe "Funktion Pos"). Danach musst du nur noch ab dieser Position die 5 neuen Bytes schreiben. (siehe Hilfe "Funktion Delete/Insert") Fertig :) Aber irgendwie habe ich das Gefühl, das du dir das Leben unnötig schwer machst (durch String-Operationen). Wenn du uns also verrätst was du machen willst, können wir dir vielleicht helfen. |
Re: Stringreplace mit einer unbekannten
Zitat:
Aber ansonsten haste schon recht, zuerst mal festestellen, ob das File diese Werte wirklich als Text hat, oder ob diese Texte von einem Hex Editor kommen, der die Zeichen als Hex code darstellt. Anschließend kannst du dann mit Pos arbeiten (warum das Leben unnötig schwer machen, wenn es strings gibt) |
Re: Stringreplace mit einer unbekannten
Zitat:
Ok, es war schlecht formuliert. Natürlich kannst du deine Bilder als Strings halten :). Aber wenn wir hier über String und deren Bearbeitung reden, geht es im Endeffekt (meistens) um PChars. Und alle Routinen die mit eben diesen arbeiten (z.B. auch das StringReplace) orientieren sich am 0-Byte. Und damit sind solche Operatioen (wie oben) mit Strings ein wenig sinnlos. :) |
Re: Stringreplace mit einer unbekannten
bei mir hat stringreplace sich noch nie an diesem 0-byte orientiert und laut quelltext macht es das auch nicht. StringReplace erwartet einen String und wenn man einen PChar übergibt wird dieser in einen String gewandelt. Und NUR in diesem Fall ist bei #0 schluss weil bei der Wandelung von PChar zu String beim #0-Byte abgeschnitten wird.
|
Re: Stringreplace mit einer unbekannten
Hallo,
das Beispiel mit den Hex-Werten aus Beitrag #1 ist wohl irreführend, da es sich dabei ja nur um die Visualierung von Daten handelt, wie sie in einem anderen Thread des OP besprochen wurde. Natürlich kann man einen beliebigen Datenblock in einen String packen und diesen dann patchen:
Delphi-Quellcode:
Das funktioniert auch, wenn der String beliebige Daten enthält. Die Fallstricke der Kombination von Pascal- und C-Routinen zur Stringverarbeitung verdeutlicht folgendes Beispiel:
function PatchString(var s: string; const prefix, data: string): Boolean;
var iPos: Integer; begin if prefix = '' then iPos := 1 else iPos := Pos(prefix, s); if iPos > 0 then iPos := iPos + Length(prefix); Result := (data <> '') and (iPos > 0) and (Pred(iPos) <= Length(s) - Length(data)); if Result then Move(data[1], s[iPos], Length(data)); end;
Delphi-Quellcode:
Grüße vom marabu
var
s: string; begin s := 'the quick brown fox jumps over the lazy dog'; if PatchString(s, 'quick', 'green') then ShowMessage(s); s := 'the'#0'quick'#0'brown'#0'fox jumps over the lazy dog'; if PatchString(s, 'quick'#0, 'green'#0) then ShowMessage(s); end; |
Re: Stringreplace mit einer unbekannten
Hab leider nicht erwähnt, das wir das in einem anderen thread besprochen haben.
Das Problem was ich bei Delphi habe, das ich keine direkten Anweisungen geben kann wie bei Assembler. Das verwirrt mich immer. Die Datei wir in Hex eingelesen und im Memo angezeigt. Im Memo möchte ich diese Hexwerte nun editieren. Nur fügt er mir die neuen Werte ein, er soll aber die alten überschreiben. Und das letzte Byte, was er erstzen soll ist dabei variabel, deshalb für mich unbekannt. Ich kenne nur das Byte durch was es ersetzt werden soll. |
Re: Stringreplace mit einer unbekannten
Zitat:
Mein StringReplace arbeitet mit AnsiPos und dieses wiederum enthält folgende Zeile:
Delphi-Quellcode:
Ab diesem Zeitpunkt muss die Funktion sich am 0-Byte orientieren, da sie ja die Länge nicht kennt.
P := AnsiStrPos(PChar(S), PChar(SubStr));
Probier doch mal folgendes:
Delphi-Quellcode:
"B" wird nicht ersetzt weil StringReplace sich am 0-Byte orientiert.
program Project1;
{$APPTYPE CONSOLE} uses SysUtils, Dialogs, Classes; var S1, S2 : String; begin S1:='A'+#0+'B'; S2:=StringReplace(S1,'B','C',[rfIgnoreCase]); Writeln(s2); Readln; end. @ReVenGer: Zitat:
|
Re: Stringreplace mit einer unbekannten
@chaosben: wieder was gelernt, dann muss ich mich entschuldigen. :oops:
|
Re: Stringreplace mit einer unbekannten
Hallo,
Zitat:
Delphi-Quellcode:
Dieses Code-Fragment überschreibt das Byte, welches deiner Byte-Signatur 3B 00 01 00 direkt folgt, mit dem Wert 02.
// Getippt und nicht getestet.
procedure TDemoForm.ButtonClick(Sender: TObject); var s: string; fn: TFileName; fs: TFileStream; begin fs := TFileStream.Create(fn, fmOpenReadWrite or fmShareDenyWrite); SetLength(s, fs.Size); fs.ReadBuffer(s[1], fs.Size); if PatchString(s, #$3B#$00#$01#$00, #$02) then begin fs.Position := 0; fs.WriteBuffer(s[1], Length(s)); end; fs.Free; end; Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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