Delphi 7和Delphi Tokyo-同一函数的不同结果

3
我正在将一份使用Delphi 7编写的旧项目转换为最新版本(Delphi Tokyo)。在旧代码中,有这个函数用于对文本进行混淆和解混淆。但当我用在Delphi Tokyo上编译的同一程序读取混淆后的文本时,它只会生成垃圾数据。
请问是否有人知道为什么同一代码在不同版本的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; 

7
在 D7 中,string 是 AnsiStrings,在 Delphi Tokio 中它是 UnicodeString。 - ain
好的,谢谢!我明白了 :) - Yngvi Thor Johannsson
1
https://dev59.com/Y2oy5IYBdhLWcg3wkO-h 可能对您有用。 :-) 从Delphi 2009开始介绍新功能,因为这是主要差异开始的地方。 - Ken White
1
这里的根本问题在于您错误地对文本进行操作。加密是对二进制数据进行操作的。 - David Heffernan
1个回答

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字符,则可能会在运行时导致意外结果。

3
然而,这并不完全没有变化,因为在转换为其他字符串类型时可能会出现代码页问题,导致你受到困扰。正确的方法是认识到加密操作是针对二进制数据而非文本进行的,并使用字节数组。一旦你这样做了,整个问题就消失了。 - David Heffernan
1
是的,这也是我改变的 :) 但你还需要将最后一行的chr函数替换为AnsiChar: Result[CharIndex] := AnsiChar(not(ord(Value[CharIndex]))); - Yngvi Thor Johannsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接