1

Delphi 7 アプリケーションと BDE (レガシー ソフトウェア) を使用しています。このように ODBC 管理者からパスワードが変更/保存されるたびに (パスワードが の場合の例 my,password)

ここに画像の説明を入力

my%2cpasswordレジストリにそのまま保存されます。

ここに画像の説明を入力

そして、私のアプリケーションはレジストリパスを読み取ります

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ファイルに書き込むとき。

HEX文字が通常の文字と混在している場合、Hex文字を適切な文字列に変換する方法は?

4

2 に答える 2

3

これは、文字列の単純な urlencoding のようです。

%2c は、urlencoding です。簡単な使用 URL デコード。

情報については、この SO の質問を確認してください標準の URL エンコード機能?

于 2012-09-26T18:20:20.657 に答える
2

% 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;

16 進数を chr に変更するには、%$に交換し、好みに応じてStrToInt使用できるものを使用しますCharChr

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;

これらを使用すると、文字列をスキャンして16進値を置き換えることができるはずです

function ReplaceHexValues(Str: String):String;
var
  Position:Integer;
  HexValue:String;
  IntValue:Integer;
  CharValue:String;
begin
  Position := 0;
  while(Position > -1)
  begin
    HexValue := GetNextHex(Str, Position);
    IntValue := PercentHexToInt(HexValue);
    CharValue := Char(IntValue);
    if (CharValue = #0) then break; 
    //Note that Position Currently contains the the start of the hex value in the string
   Delete(Str, Position, 3);
   Insert(CharValue,Str,Position);         
  end;
   Result:=Str;
end;
于 2012-09-26T09:55:19.407 に答える