【问题标题】:using serial number security in android app using delphi在使用delphi的android应用程序中使用序列号安全性
【发布时间】:2016-12-07 08:48:29
【问题描述】:

此代码在 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;

【问题讨论】:

    标签: android delphi delphi-10-seattle


    【解决方案1】:

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

    你有三个选择:

    1. 正如 @Günter_the_Beautiful 指出的那样,您最好的选择是重写代码以使用 string helpers(始终从 0 开始)
    2. 重写代码以使用基于 0 的索引:for I := 0 to ...
    3. 如果您需要快速修复,请使用 {$ZEROBASEDSTRINGS OFF} 指令在本地为您的代码 sn-p 关闭它(并再次使用 {$ZEROBASEDSTRINGS ON} 将其恢复)。

    对于选项 2. 和 3.,如果您需要跨平台代码,请考虑使用适当的平台 conditional defines。这就是选项 1. 引人注目的原因:无需使用条件定义使代码混乱。

    【讨论】:

    • 我强烈建议反对使用编译器指令来混乱你的代码,只是为了保持一个古老的奇怪习惯,即从索引1而不是像其他任何地方一样从0开始.从 XE3 或其他东西开始,有 String 帮助器可以让您以零访问权限访问字符串的 Char,而无需担心它运行的平台:if myString.Chars[0] = 'X' then ...)。见docwiki.embarcadero.com/Libraries/en/…
    • 好吧,我在两个 for 循环中都将其更改为 I := 0,还是同样的问题,重写完整代码?更新你的答案,谢谢@Ondrej Kelle
    • @unknown ... to Length(s2) - 1 ? ...to Length(s3) - 2 ?我的意思是......你总是可以,你知道,尝试使用调试器。并打开范围检查。您的索引中有复合算术。您必须从零开始对其进行分类。考虑[i*2-1]。这显然会马上出错。
    • @unknown 我建议你再努力一点。这个答案告诉你你的代码有什么问题。现在轮到你做一些工作了。不要束手无策。
    • @unknown 你不需要编译一个庞大的项目来调试它。制作一个可以在几秒钟内编译的测试应用程序。请参阅:minimal reproducible example
    【解决方案2】:

    我正在使用这两个辅助例程:

    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 开始的字符串(这是合乎逻辑的选择 :-)),只要您始终使用这两个函数将字符串作为字符访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2013-02-22
      相关资源
      最近更新 更多