Hi Zusammen,
ich würde nicht davon ausgehen, dass eine fremde Datenquelle mir saubere Daten schickt,
also habe ich noch zwei Sachen abgefangen:
1) Wenn nach dem "\x" nicht 2 Hex-Werte kommen, sondern nur einer und der String dann endet.
2) Wenn nach dem "\x" nicht 2 Hex-Werte kommen, sondern andere Zeichen und "StrToInt" schief gehen würde.
Delphi-Quellcode:
function DecodeCStyleString(const AStr: String): String;
var
HexStr : RawByteString;
ResultStr : RawByteString;
i : Integer;
iData : Integer; // Reicht Word?
begin
i := Low(AStr);
while (i <= High(AStr)) do
begin
if (AStr[i] = '\') then
begin
if ((i+3) < High(AStr)) and (AStr[i+1] = 'x') then
begin
Inc(i, 2);
HexStr := '$' + AStr[i] + AStr[i+1];
if (TryStrToInt(HexStr, iData)) then
Begin
ResultStr := ResultStr + AnsiChar(iData);
Inc(i);
end else
begin
ResultStr := ResultStr + '\x' + AStr[i];
end;
end else
begin
ResultStr := ResultStr + AnsiChar(AStr[i]);
end;
end else
begin
ResultStr := ResultStr + AnsiChar(AStr[i]);
end;
Inc(i);
end;
Result := UTF8ToString(ResultStr);
end;
Drei Dinge bleiben meiner Meinung nach noch zu klären:
1) Wenn der String mit "\xc" endet, könnte man gaaanz weit ausholen und da "\x0c" von machen,
aber will man das noch "abfangen"? Schließlich könnte man soetwas mitten im Text ja auch nicht erkennen!
2) Der Compiler spuckt noch Warnungen aus über Implizite Typ-Umwandlungen. Und Warnungen sind immer ein Hinweis darauf,
dass man etwas nicht richtig gemacht hat. Jetzt ist jemand gefragt, der sich mit Codepages und Zeichensätzen
auskennt. Man könnt das ganze zwar mit explizitem Typecase umgehen, aber das sagt dem Compiler ja
"ich weiß, was ich tue, mach einfach", aber ich weiß hier gerade nicht was ich tue, also seid ihr gefordert!
3) Wie im Kommentar schon zu sehen, aber irgendwie auch Teil von Punkt 2 "Reicht evtl. schon ein Word (2 Byte)
für das TryStrToInt?" Außerdem sagte mal jemand, dass "Integer" je nach EXE-Architektur den Standard-Zahltyp darstellt
("EXE-Architektur" ist sicher das falsche Wort, gemeint ist "Bei einem 64-Bit-Programm ist es ein 64-Bit Wert,
bei einem 16-Bit-Programm nur ein 16-Bit Wert"), aber dass kann jetzt auch von einer anderen
Programmiersprache kommen, oder ein totaler Irrläufer sein!
Außerdem gibt es vermutlich noch 1-2 Dinge zu verbessern, ohne gleich mit Pointern das ganze auf's Maximum zu optimieren.
Viel Spaß noch damit.
Liebe Grüße
Incocnito