【发布时间】:2019-11-14 09:29:33
【问题描述】:
我有 2 个函数,一个用于加密,另一个用于解密字符串,它们使用 Ord() 函数。除了使用扩展的 Ascii 代码外,它工作得很好。
如果我使用字母 ê(Ascii 代码 136),Ord() 函数会返回 234,而我预期它会返回 136。
如果我对加密字符串运行解密,我得到的结果与原始字符串不同,ê 变成了 j。
有人可以帮忙解决这个问题吗?
procedure TForm1.btnEncryptClick(Sender: TObject);
var
sTempString : string;
iIndex,
i: integer;
begin
sTempString := edtOriginalString.Text ;
for iIndex := 1 to length(sTempString) do
begin
i := ord(sTempString[iIndex]);
i := i shl 1;
sTempString[iIndex] := Char(i);
end;
edtEncryptedString.Text := sTempString;
end;
procedure TForm1.btnDecryptClick(Sender: TObject);
var
sTempString : string;
iIndex,
i : integer;
begin
sTempString := edtEncryptedString.Text ;
for iIndex := 1 to length(sTempString) do
begin
i := ord(sTempString[iIndex]);
i := i shr 1;
sTempString[iIndex] := char(i);
end;
edtDecryptedString.Text := sTempString;
end;
【问题讨论】:
-
您使用的是哪个版本的 Delphi?这实际上很重要,因为 Delphi 字符串在 Delphi 2009 及更高版本中默认为 Unicode。
-
这个错误是在旧的 Delphi 6 应用程序中发现的
-
$EA 到 $6A(ê 到 j)意味着您正在丢失最重要的位。这是因为 char 是 D6 中的字节大小。您不能对大于 127 的字符使用该加密。
-
i := (i shl 1) + (i shr 7)用于加密旋转字节并保留 lsb 中的 msb。对于解密,执行相反的操作。
标签: delphi