Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Ord() Funktion unter Android (https://www.delphipraxis.net/200638-ord-funktion-unter-android.html)

Stewag 10. Mai 2019 12:26

Ord() Funktion unter Android
 
Bei der Portierung dieses Codes für eine einfache Verschlüsselung von Windows auf Android habe ich das Problem, dass unter Android ein komplett anderes Ergebnis geliefert wird.
Hängt das vielleicht damit zusammen, das Android eine andere Codepage verwendet?

Wie kann ich erreichen, das unter Android dasselbe Ergebnis wie unter Windows geliefert wird?

Code:
Inword := 'Android';

for i := 1 to length(Inword) do
    Outword := Outword + char(ord(Inword[i])-i);

showmessage(Outword) // liefert "@lanjc]" unter Windows und "mbokd^_" unter Android
Ich setze Delphi 10.3 Community ein.

jottkaerr 10. Mai 2019 13:29

AW: Ord() Funktion unter Android
 
Könnte es sein, dass die Indexierung von Strings unter Android bei 0 beginnt?

Stewag 10. Mai 2019 13:45

AW: Ord() Funktion unter Android
 
... mmmh, du meinst so:

Code:
for i := 0 to length(Inword)-1 do
    Outword := Outword + char(ord(Inword[i])-i);
klappt aber leider auch nicht.
:(

jottkaerr 10. Mai 2019 13:53

AW: Ord() Funktion unter Android
 
Nein, wenn Du das so machst, dann subtrahierst Du am Ende eins zu wenig.

Also entweder

Code:
for i := 0 to length(Inword)-1 do
    Outword := Outword + char(ord(Inword[i])-i-1);
oder

Code:
for i := 1 to length(Inword) do
    Outword := Outword + char(ord(Inword[i-1])-i);

Stewag 10. Mai 2019 14:07

AW: Ord() Funktion unter Android
 
Super - so klappt es!
Danke!
:-D

skoschke 12. Mai 2019 08:32

AW: Ord() Funktion unter Android
 
Darauf bin ich auch schon reingefallen!

Als Android compiliert muss man ab 0 zählen, bei Windows ab 1.

Eigentlich ein Unding dass man einen Code ändern muss damit er bei Android funktioniert...

Fehler von Embarcadero?

Ciao
Stefan

Rollo62 12. Mai 2019 11:40

AW: Ord() Funktion unter Android
 
Das ist 0-based bei den Mobilen.

Dafür gibt es aber eine Reihe handlicher Helper
MyString.Chars[0];
Mystring.Length;
MyString.SubString(0, len); // glaube ich ohne nachzulesen.
...
...


Die funktionieren mit 1 und 0 based strings.

Dennis07 14. Mai 2019 23:12

AW: Ord() Funktion unter Android
 
Hier ein paar Tipps:
  • Du kannst auch den String-Helper aus
    Delphi-Quellcode:
    System.SysUtils
    nehmen. Der hat eine
    Delphi-Quellcode:
    Chars[Index]
    property, die auch bei
    Delphi-Quellcode:
    0
    beginnt.
  • Delphi-Quellcode:
    Low(MyString)
    gibt unter jeder Plattform immer den ersten verfügbaren Index des Strings zurück.
    Delphi-Quellcode:
    High(MyString)
    immer das letzte, oder, bei leeren Strings, das erste minus 1.
  • Anstatt eines direkten Casts von
    Delphi-Quellcode:
    Integer
    nach
    Delphi-Quellcode:
    Char
    , solltest du die intrinsische
    Delphi-Quellcode:
    Chr(MyOrdinal)
    -Funktion verwenden. Genau so, wie du ja auch nicht den
    Delphi-Quellcode:
    Char
    nach
    Delphi-Quellcode:
    Integer
    castest, sondern schön brav
    Delphi-Quellcode:
    Ord(MyChar)
    verwendest.

TurboMagic 15. Mai 2019 20:56

AW: Ord() Funktion unter Android
 
Man kann die 0-Indizierung auch per define abstellen, funktioniert nur leider nicht für die Helper:

{$ZEROBASEDSTRINGS OFF}

Dennis07 16. Mai 2019 00:11

AW: Ord() Funktion unter Android
 
Edit: Ups, verlesen


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