【问题标题】:Delphi 7 and Delphi Tokyo - Different results same functionDelphi 7 和 Delphi Tokyo - 不同的结果相同的功能
【发布时间】:2018-09-14 21:02:18
【问题描述】:

我正在将一个用 Delphi 7 编写的旧项目转换为最新版本(Delphi Tokyo),在旧代码中,有这个功能可以对文本进行加扰和解密,但是当我使用在 Delphi 中编译的相同程序读取加扰文本时东京它只会产生垃圾。

这里有没有人知道为什么相同的代码会表现出来并给出不同版本的 Delphi 编译的不同结果?

这里是函数:

function TForm2.EnDeCrypt(const Value : String) : String;
var
  CharIndex : integer;
begin
  Result := Value;
  for CharIndex := 1 to Length(Value) do
    Result[CharIndex] := chr(not(ord(Value[CharIndex])));
end; 

【问题讨论】:

  • 在 D7 string 中是 AnsiStrings,在 Delphi Tokio 中是 UnicodeString。
  • 好的,谢谢!现在明白了:)
  • stackoverflow.com/q/8460037/62576 可能对您有用。 :-) 从 Delphi 2009 中的新功能开始,因为它是主要差异的开始。
  • 这里的根本问题是您在对文本进行操作时出现了错误。加密对二进制数据进行操作。

标签: delphi pascal


【解决方案1】:

从 Delphi 2009 开始,string 类型自动映射到 Unicode 兼容的 UnicodeString 类型。之前,它映射到AnsiString 类型。

您可以通过明确地使用 AnsiStringAnsiChar 来使用您的例程。

function TForm2.EnDeCrypt(const Value : AnsiString) : AnsiString;
var
  CharIndex : integer;
begin
  Result := Value;
  for CharIndex := 1 to Length(Value) do
    Result[CharIndex] := AnsiChar(not(ord(Value[CharIndex])));
end; 

请注意,如果传递给函数的字符串确实包含无法映射到本地 ANSI 字符集的 unicode 字符,这可能会在运行时导致意外结果。

【讨论】:

  • 这并没有完全改变,因为在转换为其他字符串类型时,您可能会被代码页的问题所困扰。正确的方法是认识到加密对二进制数据而不是文本进行操作并使用字节数组。一旦你这样做了,整个问题就消失了。
  • 是的,这也是我更改的内容 :) 但是您还需要在最后一行将 chr 函数替换为 AnsiChar:Result[CharIndex] := Ansichar(not(ord(Value[CharIndex]) ));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多