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

时间:2012-09-26 09:46:55

标签: delphi postgresql delphi-7

我正在使用Delphi 7应用程序和BDE(传统软件)。 每当从ODBC管理员更改/保存密码时 像这样(例如,如果密码是my,password

enter image description here

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

enter image description here

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

  

HKEY_CURRENT_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文件时。

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

2 个答案:

答案 0 :(得分:3)

这似乎是字符串的直接urlencoding。

在urlencoding中,

%2c是。简单使用url decode。

查看此SO问题以获取信息Standard URL encode function?

答案 1 :(得分:2)

由于得到的编码为%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,请将换成 $ 并使用StrToInt,然后您可以将其用于Char或{{ 1}}取决于您的偏好。

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;