Как эту процедуру Java можно преобразовать в Delphi? - PullRequest
2 голосов
/ 19 февраля 2010

Мне нужно конвертировать этот код в Delphi. Но с этим слишком сложно справиться ...

Спасибо ...

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()

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010
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:

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

Версия Delphi:

XorString('STACKOVERFLOWCOM', 'ASDFQWERTYKMLYDR')
 => gives '120705051A181317061F07021B1A0B1F'
3 голосов
/ 19 февраля 2010

То, что это делает, довольно просто, правда.Он берет строку ввода и ключ и XOR их вместе, а затем возвращает результат в виде потока шестнадцатеричных цифр.Вот эквивалент 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;

Я не стал переводить процедуру GetHexDigit, так как SysUtils.IntToHex выполняет ту же функцию.Кроме того, как указал Ульрихб, для этого требуется строка ключа, по крайней мере, такая же, как строка "txt".В противном случае вы получите ошибку проверки диапазона.(Вы компилируете с проверкой диапазона, верно?)

РЕДАКТИРОВАТЬ: Не уверен, почему бит >> 4 and 0x0f присутствует при преобразовании.У меня нет удобного компилятора Java, так что это может быть просто языковой проблемой, но мне кажется, что этот сдвиг битов всегда будет давать результаты в пределах 0..3 для буквенных символов, а также сделает невозможным обратный процесс,обычно это весь смысл шифрования xor .Если вам не нужно поддерживать совместимость с этим алгоритмом Java, я заменил бы цифровую строку на:

digit := intToHex(ch, 2);

, что даст вам более правильный и обратимый результат.

EDIT2Ладно, было слишком рано, чтобы делать тяжелую логику, когда я писал это.Я полностью упустил тот факт, что он дважды вызывал GetHexDigit.Исправлен алгоритм.

...