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

时间:2016-12-07 08:48:30

标签: android delphi delphi-10-seattle

此代码在Firemonkey Windows应用中运行,但在Android应用中不起作用,我得Goodbye而不是Welcome,出了什么问题?

Edit8 Text:162496 //计算机唯一代码

Edit9 Text:1564224593 // serial#

  procedure TForm2.Button5Click(Sender: TObject);
  var
   f2,f1:textfile;
   i,j:byte;
   s1,s2,s3,c:string;
   F: TextFile;
  begin
    j:=0;
    s2 := Edit8.Text;

    for i:=1 to  Length(s2) do
    if (s2[i]>='0') and (s2[i]<='9') then
    s3:=s3+s2[i];

    for i:=1 to  Length(s3)-1 do
    if (edit9.Text[i*2-1]<>s3[i]) or (abs(strtoint(s3[i+1])-strtoint(s3[i]))<> strtoint(edit9.Text[i*2])) then 
    inc(j);

    if j=0 then
      ShowMessage('Welcome')
    else
       ShowMessage('Goodbye');
  end;

2 个答案:

答案 0 :(得分:4)

Delphi移动编译器使用zero-based strings

您有三种选择:

  1. 正如@Günter_the_Beautiful指出的那样,您最好的选择是重写代码以使用string helpers(始终从0开始)
  2. 重写您的代码以使用基于0的索引:for I := 0 to ...
  3. 如果您需要快速修复,请使用{$ZEROBASEDSTRINGS OFF}指令在本地为您的代码段将其关闭(并再次使用{$ZEROBASEDSTRINGS ON}还原)。
  4. 对于选项2和3.,如果您需要跨平台代码,请考虑使用适当的平台conditional defines。这就是选项1.引人注目的原因:不需要使用条件定义来混淆代码。

答案 1 :(得分:-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的字符串(这是逻辑选择:-))。