Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Umwandeln eines Characters (https://www.delphipraxis.net/205036-umwandeln-eines-characters.html)

gro 26. Jul 2020 11:17

Umwandeln eines Characters
 
Ich habe folgendes Problem
Ein String muss in einen Hexstring umgewandelt werden und dieser wieder retour in einen String
Dazu folgender minimaler Codeblock

Delphi-Quellcode:
procedure THeaderFooterForm.Button1Click(Sender: TObject);
var
  szInputString : String;
  szEncodeString : String;
  szDecodeString : String;
  iValue : Integer;

begin
  szInputString := '€';

  // umwandeln zu einen Hexstring
  iValue := Trunc(Byte(szInputString[1]));   // Result 172  <<- Anmerkung eigentlich ist das auch schon falsch da es eigentlich 128 sein müsste
  szEncodeString := IntToHex(iValue, 2);     // Result $AC  <<- Müsste eigentlich $80 sein

  // Rückwandeln der Hexwertes in einen String                                           //
  iValue := StrToInt('$' + szEncodeString);  // Result 172
  szDecodeString := char(iValue);            // so? und was soll hier passieren damit wieder € rauskommt???

  if (szDecodeString <> szInputString) then begin
    // leider unterschiedlich
    Beep;
  end;

end;
Was mach ich hier falsch???
Das Hauptproblem das ich hier habe ist, das das ganze auch unter Android funktionieren sollte.

Folgendes würde funktionieren ist aber für Android nicht geeignet das es keinen AnsiChar unter Android gibt

Delphi-Quellcode:
procedure THeaderFooterForm.Button1Click(Sender: TObject);
var
  szInputString : RawByteString;
  szEncodeString : String;
  szDecodeString : String;
  iValue : Integer;

begin
  szInputString := '€';

  // umwandeln zu einem Hexstring
  iValue := Trunc(Byte(szInputString[1]));   // Result 172  <<- Anmerkung eigentlich ist das auch schon falsch da es eigentlich 128 sein müsste
  szEncodeString := IntToHex(iValue, 2);     // Result AC  <<- Müsste eigentlich $80 sein

  // Rückwandeln der Hexwertes in einen String                                           //
  iValue := StrToInt('$' + szEncodeString);  // Result 172
  szDecodeString := ansichar(iValue);            // Das würde funktionieren ist aber leider nicht praktikabel da es unter Android kein "AnsiChar" gibt

  if (szDecodeString <> szInputString) then begin
    // leider unterschiedlich
    Beep;
  end;

end;

dataspider 26. Jul 2020 14:19

AW: Umwandeln eines Characters
 
Ich nehme für Char in Byte Ord() und zurück Chr()
Habe aber keinen Schimmer, wie das mit Android ist...

Frank

gro 26. Jul 2020 15:24

AW: Umwandeln eines Characters
 
Besten Dank. Das "Ord" wars
Und so funktionierts auch unter Android

Delphi-Quellcode:
procedure THeaderFooterForm.Button1Click(Sender: TObject);
var
  szInputString : String;
  szEncodeString : String;
  szDecodeString : String;
  iValue, iIndex : Integer;

begin
  szInputString := '&#8364;';
  iIndex := 1;
  {$IFDEF ANDROID}
    iIndex := 0;
  {$ENDIF}

  // umwandeln to einem Hexstring
  iValue := Ord(szInputString[iIndex]);
  szEncodeString := IntToHex(iValue, 4);

  // Rückwandeln der Hexwertes in einen String
  iValue := StrToInt('$' + szEncodeString);
  szDecodeString := chr(iValue);

end;
Besten Dank nochmals

himitsu 26. Jul 2020 16:39

AW: Umwandeln eines Characters
 
Und was ist mit iOS?
Und wieso hörst du nicht auf den Compiler, der dir hier Warnungen um die Ohren werden sollte? (z.B. zugewieserner Wert an Variable wird nicht benutzt)


Aber eigentlich ist es falsch hier auf eine Platform zu unterscheiden, denn das mit dem 0-Index kann dir auch im Windows passieren.
Die richtige Option, auf die man hört ist {$ZeroBasedStrings ON} oder OFF, oder eben man holt sich aus dem Typ die Information.

PS:
Delphi-Quellcode:
iValue := Ord(szInputString[Low(String)]);
// oder
iValue := Ord(szInputString.Chars(0)); // diese Helper sind immer mit 0

Byte und AnsiChar war sowieso nicht "ganz" richtig,
denn es ist ja ein WideChar, welcher ein Word groß ist.

String = UnicodeString, seit 2009 ..... aber bis vor 2009 war es fast richtig, weil es da noch ein AnsiString war.

Und fast, weil es noch nie richtig war, denn String war/ist ein compilerabhängiger Typ, der sich auch mal verändern kann, wie man mit Delphi 2009 erleben durfte.
Char PChar String
AnsiChar PAnsiChar AnsiString
WideChar PWideChar WideString UnicodeString
Wer statische Typen mit dynamischen vermischt, ist selbst Schuld, wenn es mal nicht stimmen könnte.

z.B. Pointer in Integern speichern -> leider wurde Integer eingefroren (16 -> 32 Bit machte er noch mit), aber ab jetzt gibt es den NativeInt, der jetzt zwischen 32 und 64 Bit mitwächst.
bzw. ich verwende lieber den IntPtr (aus C++ bekannt)

gro 26. Jul 2020 18:16

AW: Umwandeln eines Characters
 
Besten Dank für die Anmerkung. Vor allem das mit dem {$ZeroBasedStrings ON}
Ich bin zwar schon seit über 20 Jahren Delphianer aber erst seit kurzen auf eine neuere Version (10.3 Rio) umgestiegen.
(Vorher Delphi-XE :-D)
Dadurch ist für mich speziell in der Multiplattform-Entwicklung vieles neu.
Aber es wird. Hoffe ich zumindest :-)
Besten Dank nochmals


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf