2

I need to convert this code into Delphi. But it's too complicated to handle...

Thanks...

String key = xorString("STACKOVERFLOWCOM", "ASDFQWERTYKMLYDR");

String xorString(String txt, String xor) {
  StringBuffer str = new StringBuffer();
  for( int i = 0; i < txt.length(); i++ ) {
    int ch = txt.charAt(i) ^ xor.charAt(i);
    char digit = getHexDigit((ch >> 4) & 0x0f);
    str.append(digit);
    digit = getHexDigit(ch & 0x0f);
    str.append(digit);
  } // for()
  return str.toString();
} // xorString()

char getHexDigit(int nibble) {
  if( nibble >= 0 && nibble <= 9 ) return (char)((int)'0' + nibble);

  return (char)((int)'A' + nibble - 10);
} // getHexDigit()
4

2 に答える 2

3

これがしていることは、本当に簡単です。入力文字列とキーを取得し、それらをXORして、結果を16進数のストリームとして返します。Delphiに相当するものは次のとおりです。

function xorString(txt, key: string): string;
var
  i: integer;
  ch: byte; //change to word for D2009+
  digit: string;
begin
  result := '';
  for i := 1 to length(txt) do
  begin
    ch := byte(txt[i]) xor byte(key[i]); //change byte to word for D2009+
    digit := IntToHex(ch, 2);
    result := result + digit;
  end;
end;

SysUtils.IntToHexが同じ関数を実行するため、GetHexDigitルーチンをわざわざ翻訳する必要はありませんでした。また、Ulrichbが指摘したように、これには少なくとも「txt」文字列と同じ長さのキー文字列が必要です。そうしないと、範囲チェックエラーが発生します。(範囲チェックをオンにしてコンパイルしていますよね?)

編集:>> 4 and 0x0f変換時にビットが存在する理由がわかりません。私はJavaコンパイラを手元に持っていないので、言語の問題かもしれませんが、このビットシフトは常にアルファベット文字の0..3以内の結果を生成し、プロセスを逆にすることを不可能にするように見えます。これは通常、 xor暗号化の全体的なポイントです。このJavaアルゴリズムとの互換性を維持する必要がない場合は、数字の行を次のように置き換えます。

digit := intToHex(ch, 2);

これにより、より正確で可逆的な結果が得られます。

EDIT2:わかりました、私がそれを書いたとき、重い論理を行うには少し早すぎました。GetHexDigitを2回呼び出していたという事実を完全に見逃しました。アルゴリズムを修正しました。

于 2010-02-19T13:21:38.627 に答える
3
function XorString(TextStr, XorStr: string): string;
var
  I, Xored: Integer;
begin
  Assert(Length(TextStr) <= Length(XorStr));
  Result := '';

  for I := 1 to Length(TextStr) do
  begin
    Xored := Ord(TextStr[I]) xor Ord(XorStr[I]);
    Result := Result + IntToHex(Xored AND $FF, 2);
  end;
end;

Java version:

xorString("STACKOVERFLOWCOM", "ASDFQWERTYKMLYDR")
 => gives "120705051A181317061F07021B1A0B1F"

Delphi version:

XorString('STACKOVERFLOWCOM', 'ASDFQWERTYKMLYDR')
 => gives '120705051A181317061F07021B1A0B1F'
于 2010-02-19T13:29:32.867 に答える