【发布时间】:2020-06-01 22:28:42
【问题描述】:
最近我从 D2007 迁移到 10.3.3,但遇到了以下问题。
我有一个 TClientDataSet,它通过将加密字符串存储在 TStringField 中并使用 .saveToFile 方法将数据记录为 .cds 格式。问题是,字符串没有正确记录到 CDS 表中。
这是我的加密功能:
function encrypt(const ent: string): string;
var m, i, k : integer;
r, s : string;
begin
m := 3;
r := '';
for I := 1 to Length(ent) do
begin
k := ord(ent[i]);
s := chr(k+m);
r := r + s;
inc(m);
end;
result := r;
end;
这是我的解密函数:
function decrypt(const ent: string): string;
var m, i,j,K : integer;
r, s : string;
begin
m := 3;
r := '';
s := ent;
for I := 1 to length(s) do
begin
if ord(s[i]) < 68 then j := 1 else
j := -1;
k := ord(s[i]);
r := r + chr(k-m);
inc(m);
end;
result := r;
end;
现在我想用字符串 'engajamento1234' 调用这个函数。 以下是手表显示加密字符串的方式:
下面是字符串实际插入到表的 TStringField 列中的方式:
由于字符串最终被错误地插入到客户端数据集,当我使用 'hrlgqivoy?|?ACE' 字符串调用解密函数时,我得到不正确的原始字符串为 'engajamen3o1234'...
似乎这个问题与新Delphi版本中的UTF8支持有关,旧版本没有。
我需要将字符串正确记录到客户端数据集和 .cds 文件中,这样我才能得到正确的解密字符串?
【问题讨论】:
-
在不知道数据实际应该是什么的情况下,Watch 窗口显示的内容并没有真正的帮助。您应该添加一个代码示例,显示数据被插入 CDS 并从中读取。也许您的意思是使用 Rio 无法正确读取使用 D2007 保存到磁盘的 CDS 数据?
-
数据应该和第一个手表显示的一样;第二个是替换 #$0080 为 ?
-
问题只出在 Rio 上:它错误地保存了数据。
-
当您执行 CDS.SaveToFile 时,您使用的是什么 TPacketDataFormat?我仍然认为您需要一个演示问题的代码示例,顺便说一句。
-
好的,我刚刚用我正在使用的实际代码更新了问题。
标签: delphi delphi-2007 delphi-10.3-rio