Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringReplace - Problem mit $00 ? (https://www.delphipraxis.net/132834-stringreplace-problem-mit-%2400.html)

moelski 20. Apr 2009 19:18


StringReplace - Problem mit $00 ?
 
Moin !

Also entweder habe ich gerade ne Blockade, oder mein Compiler mag mch nimmer. :gruebel:

Delphi-Quellcode:
function HexStrToString(const value:string):string;
begin
   SetLength(Result, Length(value) div 2); // es wird halber Platz benötigt
   if Length(value) > 0 then
      HexToBin(PChar(value), PChar(Result), Length(value));
end;

Procedure .... Whatever ....
var DataConvert, Data : String;
Const FEND      = $C0;    //Frame END
Const FESC      = $DB;    //Frame ESCape
begin
  Data := HexStrToString('C01D0D024022F920FF08D60000001901DBDC');
  DataConvert := StringReplace(Data, chr($DB) + chr($DC), CHR(FEND), [rfReplaceAll, rfIgnoreCase]);
  DataConvert := StringReplace(Data, chr($DB) + chr($DD), CHR(FESC), [rfReplaceAll, rfIgnoreCase]);
  ShowMessage(DataConvert);
end;
Wenn ich das ausführe dann sollte hinten das DBDC ersetzt werden durch C0. Aber da passiert rein gar nichts. :cyclops:
Hab ich hier einen generellen Fehler oder wat is da los?

moelski 20. Apr 2009 19:28

Re: StringReplace - chr($DB) + chr($DC) nicht ersetzbar ?!
 
Moin nochmal ..

Kann es sein das StrngReplace ein Problem mit $00 hat ?

Denn das geht nicht:
Data := HexStrToString('001901DBDC');

Aber das geht :
Data := HexStrToString('1901DBDC');

himitsu 20. Apr 2009 19:42

Re: StringReplace - Problem mit $00 ?
 
Woran erkennst du das StringReplace ein Problem hat?

Eigentlich sollte dieses keine Probleme damit haben, aber deine MessageBox (ShowMessage) hat große Probleme damit :angel2:

moelski 20. Apr 2009 19:43

Re: StringReplace - Problem mit $00 ?
 
Die MessageBox war ja nur damit der Compiler das nicht gleich verwirft.

Ich habe mir das im Debugger angesehen. Und da kann man eben sehen das kein replace statt findet :-(

himitsu 20. Apr 2009 19:46

Re: StringReplace - Problem mit $00 ?
 
hmmm :gruebel: ich schau mal, aber eigentlich hatte ich da noch nie Probleme damit (du bist grad in D7?)

PS:
Code:
Data := HexStrToString('C01D0D024022F920FF08D60000001901DBDC');
DataConvert := StringReplace(Data, chr($DB) + chr($DC), ...
DataConvert := StringReplace([b]DataConvert[/b], chr($DB) + ...]);
[add]
laß mal das rfIgnoreCase weg ... eventuell hat das interne AnsiUpperCase Probleme

moelski 20. Apr 2009 19:50

Re: StringReplace - Problem mit $00 ?
 
Moin !

Zitat:

laß mal das rfIgnoreCase weg
Das bringt leider auch nix

Christian Seehase 20. Apr 2009 19:52

Re: StringReplace - Problem mit $00 ?
 
Moin Dominik,

einen Workaround kann ich Dir noch anbieten:
Ersetze die Werte als String, und wandele anschliessend den String um statt umgekehrt.

himitsu 20. Apr 2009 19:52

Re: StringReplace - Problem mit $00 ?
 
OK, das kommt davon, wenn man meißt eine andere Version der Funktionen nutz :oops:

Also Probleme gibt es mit AnsiPos im StringReplace, denn dises nutzt einen PChar und der schneidet bei #0 nunmal ab,
darum wird nichts nach einem #0 gefunden.


[add]
also die legalen Lösungen:

schau dir mal andere Implementationen der Funktion an ... z.B. siehe FastStringsProject (oder so)

ODER

kopier dir aus der SysUtils.pas die Funktion StringReplace raus und ersetze in deiner Kopie das AnsiPos durch Pos.

Falls du im Forum etwas suchst, kannst du auch rausfinden wie man die SysUtils neu kompiliert, dann kannst du das auch direkt in der SysUtils ändern :angel:

moelski 20. Apr 2009 20:03

Re: StringReplace - Problem mit $00 ?
 
Moin !

Zitat:

kopier dir aus der SysUtils.pas die Funktion StringReplace raus und ersetze in deiner Kopie das AnsiPos durch Pos.
Danke das hilft mir erstmal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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