Frage

Ich brauche diesen Code in Delphi zu konvertieren. Aber es ist zu kompliziert zu handhaben ...

Danke ...

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()
War es hilfreich?

Lösung

Was dies tut, ist ziemlich einfach, wirklich. Es dauert eine Eingabezeichenfolge und einen Schlüssel und eine XOR-Verknüpfung sie zusammen, dann das Ergebnis als einen Strom von hexadezimalen Ziffern zurück. Hier ist die Delphi-Äquivalent:

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;

Ich habe nicht die Mühe, die GetHexDigit Routine zu übersetzen, da SysUtils.IntToHex die gleiche Funktion ausführt. Auch als Ulrichb wies darauf hin, dies erfordert eine Schlüsselfolge mindestens so lang wie die „txt“ string. Andernfalls müssen Sie einen Range-Check-Fehler. (Sie kompilieren mit Bereichsprüfung auf, nicht wahr?)

EDIT: Nicht sicher, warum das >> 4 and 0x0f Bit gibt es bei der Konvertierung. Ich habe keine Java-Compiler handlich, so dass es nur ein sprachliches Problem sein könnte, aber es sieht aus wie dies bitshifting mich immer Ergebnisse innerhalb von 0..3 für alphabetische Zeichen erzeugen, und es ist auch unmöglich machen, den Prozess umzukehren, das ist in der Regel der gesamte Punkt von xor Verschlüsselung. Wenn Sie nicht brauchen Kompatibilität mit diesem Java-Algorithmus zu halten, würde ich die Ziffernleitung ersetzen mit:

digit := intToHex(ch, 2);

, die wird Ihnen eine korrektere und reversible Ergebnis.

EDIT2: OK, es war ein wenig zu früh am Morgen zu tun schwere Logik werden, als ich das schrieb. Ich vermisste völlig die Tatsache, dass es GetHexDigit zweimal rief. Der Algorithmus,.

Andere Tipps

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'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top