Мне нужно преобразовать этот код в 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()
То, что это делает, довольно просто. Он принимает входную строку и ключ и 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. Исправлен алгоритм.
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'