Delphi 从注册表读取时将十六进制转换为字符串

Delphi 从注册表读取时将十六进制转换为字符串,delphi,postgresql,delphi-7,Delphi,Postgresql,Delphi 7,我正在使用Delphi7应用程序和BDE(遗留软件)。 每当从ODBC管理员更改/保存密码时 如下所示(例如,如果密码是我的,则为密码) 它在注册表中保存为my%2cpassword 我的应用程序读取注册表路径 HKEY\U CURRENT\U USER\Software\ODBC\ODBC.INI\mysource 密码 然后使用密码执行psql命令 "C:\Program Files (x86)\PostgreSQL\9.0\bin\psql.exe" -h localhost

我正在使用Delphi7应用程序和BDE(遗留软件)。 每当从ODBC管理员更改/保存密码时 如下所示(例如,如果密码是我的,则为密码)

它在注册表中保存为
my%2cpassword

我的应用程序读取注册表路径

HKEY\U CURRENT\U USER\Software\ODBC\ODBC.INI\mysource
密码

然后使用密码执行psql命令

   "C:\Program Files (x86)\PostgreSQL\9.0\bin\psql.exe"  -h localhost -p 5432 -d myDB -U myadmin -f "C:\Users\user\AppData\Roaming\ff.sql"
由于密码中现在有
%2c
而不是
身份验证失败。 当我读取密码并写入
pgpass.conf
文件时


当十六进制字符与普通字符混合时,如何将十六进制字符转换为正确的字符串?

由于%的get编码为%25,您应该能够从字符串中选择它们并将它们更改回其代表字符

要做到这一点,您需要使用Pos/PosEx在str中找到%,并拉出它后面的2个数字(我认为总是2)

这是我想不起的,所以如果它没有编译,请道歉/参数的顺序错误等等。这应该足以让你大致了解一下

function GetNextHex(InStr:String;var Position:Integer):String;
var
  NextHex: Integer;
begin
  NextHex := PosEx('%', InStr, Position);
  if (NextHex > -1) then
    Result := Copy(InStr, NextHex, 3)
  else 
    Result := '';
  Position := NextHex;
end;
要将十六进制更改为chr,请将%替换为$并使用
strott
,然后根据您的喜好将其与
Char
chr
一起使用

function PercentHexToInt(Hex: String):Integer;
  var
   str : string;
begin
    if (Hex[1] <> '%') then  Result := 0
    else
   begin
   // Result := strtoint(StrToHex('$' + Copy(Hex, 1,2)));
      str :=StringReplace(HEx,'%','',[rfReplaceAll,rfIgnoreCase]);
      str:=trim(str);
      Result := StrToInt(('$' +str));
  end;
end;

由于%get编码为%25,您应该能够从字符串中选择它们,并将它们更改回其代表字符

要做到这一点,您需要使用Pos/PosEx在str中找到%,并拉出它后面的2个数字(我认为总是2)

这是我想不起的,所以如果它没有编译,请道歉/参数的顺序错误等等。这应该足以让你大致了解一下

function GetNextHex(InStr:String;var Position:Integer):String;
var
  NextHex: Integer;
begin
  NextHex := PosEx('%', InStr, Position);
  if (NextHex > -1) then
    Result := Copy(InStr, NextHex, 3)
  else 
    Result := '';
  Position := NextHex;
end;
要将十六进制更改为chr,请将%替换为$并使用
strott
,然后根据您的喜好将其与
Char
chr
一起使用

function PercentHexToInt(Hex: String):Integer;
  var
   str : string;
begin
    if (Hex[1] <> '%') then  Result := 0
    else
   begin
   // Result := strtoint(StrToHex('$' + Copy(Hex, 1,2)));
      str :=StringReplace(HEx,'%','',[rfReplaceAll,rfIgnoreCase]);
      str:=trim(str);
      Result := StrToInt(('$' +str));
  end;
end;

这似乎是字符串的简单URL编码

%2c是URL编码中的。简单使用url解码


请查看此问题以获取信息这似乎是字符串的简单URL编码

%2c是URL编码中的。简单使用url解码


查看此SO问题以获取信息

好的,我得到的第一部分是
StringReplace(Edit1.Text,'%25','%',[rfReplaceAll,rfIgnoreCase])。。你能告诉我更多关于第二部分的信息吗?谢谢你的代码,但是我如何在
ReplaceHexValues
中减少
Position
?as<代码>位置:=位置-1在无限循环中运行。我对代码做了一些修改,当没有找到搜索值时,thoughPosEx应该返回-1,所以我向前扫描字符串,直到没有找到更多匹配项。该位置被传递到一个var参数中,以便在GetNextHex方法中进行更新。虽然我当时应该中断循环,但我已经更新了代码,以便在没有找到更多匹配项时中断。嗨,我已经对代码进行了更改..但它仍然没有退出循环
hex
永远不会变为空中断代码现在可以工作了。!!,sory cant+1(rep太低)但接受了。(鞠躬)好的,我得到的第一部分是
StringReplace(Edit1.Text,'%25','%',[rfReplaceAll,rfIgnoreCase])。。你能告诉我更多关于第二部分的信息吗?谢谢你的代码,但是我如何在
ReplaceHexValues
中减少
Position
?as<代码>位置:=位置-1在无限循环中运行。我对代码做了一些修改,当没有找到搜索值时,thoughPosEx应该返回-1,所以我向前扫描字符串,直到没有找到更多匹配项。该位置被传递到一个var参数中,以便在GetNextHex方法中进行更新。虽然我当时应该中断循环,但我已经更新了代码,以便在没有找到更多匹配项时中断。嗨,我已经对代码进行了更改..但它仍然没有退出循环
hex
永远不会变为空中断代码现在可以工作了。!!,sory超高+1(代表过低),但已接受。(鞠躬)