使用delphi在android应用程序中使用序列号安全

使用delphi在android应用程序中使用序列号安全,android,delphi,delphi-10-seattle,Android,Delphi,Delphi 10 Seattle,此代码在Firemonkey Windows应用程序中有效,但在Android应用程序中无效,我得到的是再见而不是欢迎,怎么了 Edit8文本:162496//计算机唯一代码 Edit9文本:1564224593//序列号# 程序TForm2.按钮5点击(发送方:TObject); 变量 f2,f1:文本文件; i、 j:字节; s1,s2,s3,c:字符串; F:文本文件; 开始 j:=0; s2:=Edit8.Text; 对于i:=1到长度(s2)do 如果(s2[i]>='0')和(s2[

此代码在Firemonkey Windows应用程序中有效,但在Android应用程序中无效,我得到的是
再见
而不是
欢迎
,怎么了

Edit8文本:162496//计算机唯一代码

Edit9文本:1564224593//序列号#

程序TForm2.按钮5点击(发送方:TObject);
变量
f2,f1:文本文件;
i、 j:字节;
s1,s2,s3,c:字符串;
F:文本文件;
开始
j:=0;
s2:=Edit8.Text;
对于i:=1到长度(s2)do

如果(s2[i]>='0')和(s2[i]Delphi移动编译器使用

你有三个选择:

  • 正如@Günter_the_Beautiful所指出的,您最好的选择是重写代码以供使用(代码总是基于0)
  • 重写代码以使用基于0的索引:
    将I:=0改为…
  • 如果需要快速修复,请使用
    {$ZEROBASEDSTRINGS off}
    指令在代码段本地将其关闭(并再次使用
    {$ZEROBASEDSTRINGS ON}
    将其还原)

  • <选项> 2和3。如果你需要你的代码是跨平台的,考虑使用合适的平台。这就是选项1。强制:不需要用条件定义来扰乱你的代码。

    < Pdel> Delphi移动编译器使用.< /P> 你有三个选择:

  • 正如@Günter_the_Beautiful所指出的,您最好的选择是重写代码以供使用(代码总是基于0)
  • 重写代码以使用基于0的索引:
    将I:=0改为…
  • 如果需要快速修复,请使用
    {$ZEROBASEDSTRINGS off}
    指令在代码段本地将其关闭(并再次使用
    {$ZEROBASEDSTRINGS ON}
    将其还原)

  • <选项> 2和3。如果你需要你的代码是跨平台的,考虑使用合适的平台。这就是选项1。强制:不需要用条件定义来扰乱你的代码。

    < P>我使用这两个助手例程:

    FUNCTION GetChar(CONST S : STRING ; OneBasedIndex : LongWord) : CHAR;
      BEGIN
        {$IF CompilerVersion>=24 }
          Result:=S[SUCC(OneBasedIndex-LOW(S))]
        {$ELSE }
          Result:=S[OneBasedIndex]
        {$IFEND }
      END;
    
    PROCEDURE SetChar(VAR S : STRING ; OneBasedIndex : LongWord ; NewChar : CHAR);
      BEGIN
        {$IF CompilerVersion>=24 }
          S[SUCC(OneBasedIndex-LOW(S))]:=NewChar
        {$ELSE }
          S[OneBasedIndex]:=NewChar
        {$IFEND }
      END;
    

    这样,只要始终使用这两个函数作为字符访问字符串,就可以继续使用基于1的字符串(这是逻辑选择:-)。

    我使用这两个帮助程序例程:

    FUNCTION GetChar(CONST S : STRING ; OneBasedIndex : LongWord) : CHAR;
      BEGIN
        {$IF CompilerVersion>=24 }
          Result:=S[SUCC(OneBasedIndex-LOW(S))]
        {$ELSE }
          Result:=S[OneBasedIndex]
        {$IFEND }
      END;
    
    PROCEDURE SetChar(VAR S : STRING ; OneBasedIndex : LongWord ; NewChar : CHAR);
      BEGIN
        {$IF CompilerVersion>=24 }
          S[SUCC(OneBasedIndex-LOW(S))]:=NewChar
        {$ELSE }
          S[OneBasedIndex]:=NewChar
        {$IFEND }
      END;
    

    这样,您可以继续使用基于1的字符串(这是逻辑选择:-))只要你总是使用这两个函数以字符的形式访问字符串。

    我强烈建议不要用编译器指令把代码弄得乱七八糟,只是为了保持从索引
    1
    开始而不是像其他地方那样从
    0
    开始的奇怪习惯。由于XE3或其他一些东西,有一些字符串帮助程序可以让您以零访问权限访问字符串的
    Char
    ,而无需担心它运行的平台:
    如果myString.Chars[0]='X',那么…
    )。好吧,我在两个for循环中都将其更改为
    i:=0
    ,还是相同的问题,重写完整的代码?更新您的答案,谢谢@OndrejKelle@unknown
    。。。到长度(s2)-1
    <代码>到长度(s3)-2
    ?我是说。。。你知道,你总是可以尝试使用调试器。并打开范围检查。你的索引中有复合算法。你必须把它归为零。考虑<代码> [I*2-1 ] < /代码>。这显然马上就会出问题。@unknown我建议你再努力一点。这个答案告诉您代码有什么问题。现在轮到你做些工作了。不要束手无策。@unknown您不需要编译一个庞大的项目来调试它。制作一个可以在几秒钟内编译的测试应用程序。请看:我强烈建议不要为了保持从索引
    1
    而不是像其他任何地方那样从
    0
    开始的奇怪习惯,就用编译器指令来混乱代码。由于XE3或其他一些东西,有一些字符串帮助程序可以让您以零访问权限访问字符串的
    Char
    ,而无需担心它运行的平台:
    如果myString.Chars[0]='X',那么…
    )。好吧,我在两个for循环中都将其更改为
    i:=0
    ,还是相同的问题,重写完整的代码?更新您的答案,谢谢@OndrejKelle@unknown
    。。。到长度(s2)-1
    <代码>到长度(s3)-2?我是说。。。你知道,你总是可以尝试使用调试器。并打开范围检查。你的索引中有复合算法。你必须把它归为零。考虑<代码> [I*2-1 ] < /代码>。这显然马上就会出问题。@unknown我建议你再努力一点。这个答案告诉您代码有什么问题。现在轮到你做些工作了。不要束手无策。@unknown您不需要编译一个庞大的项目来调试它。制作一个可以在几秒钟内编译的测试应用程序。见: