Как эту процедуру Java можно преобразовать в Delphi?

2

Мне нужно преобразовать этот код в 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()
  • 0
    Что вы сделали до сих пор?
  • 0
    То, что до сих пор делал Уайта, вероятно, смотрит на это с недоверием и пытается выяснить, что он делает и как. Я думаю, что это ошеломляет меня. Я бы тоже попросил помощи. Почему вы возражаете против Уайты с просьбой о помощи?
Показать ещё 4 комментария
Теги:
xor

2 ответа

3
Лучший ответ

То, что это делает, довольно просто. Он принимает входную строку и ключ и 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". В противном случае вы получите ошибку проверки диапазона. (Вы компилируете с проверкой диапазона, правильно?)

EDIT: Не знаю, почему бит >> 4 and 0x0f существует при преобразовании. У меня нет компилятора Java, поэтому это может быть проблема языка, но мне кажется, что эта битхифтинг всегда будет давать результаты в пределах 0..3 для алфавитных символов, а также сделать невозможным изменение процесса, обычно это целая точка шифрования xor. Если вам не нужно поддерживать совместимость с этим Java-алгоритмом, я бы заменил цифровую строку:

digit := intToHex(ch, 2);

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

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

  • 0
    Код переключения Уайты в порядке, и он обратим. Исходный код добавляет две цифры, по одной за раз, тогда как ваш добавляет только одну.
  • 0
    О, я вижу, что он делает. ОК, моя ошибка
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:

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

Версия Delphi:

XorString('STACKOVERFLOWCOM', 'ASDFQWERTYKMLYDR')
 => gives '120705051A181317061F07021B1A0B1F'
  • 0
    Ваше утверждение немного строго. XorStr должен быть как минимум такой же длины, как TextStr, а не обязательно такой же длины.
  • 0
    Спасибо вам обоим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню