如何将这个Java例程转换为Delphi?

时间:2010-02-19 12:58:12

标签: java delphi xor

我需要将此代码转换为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 个答案:

答案 0 :(得分:3)

这样做真的很简单。它接受一个输入字符串和一个键并将它们一起进行异或,然后将结果作为十六进制数字流返回。这是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执行相同的功能。此外,正如Ulrichb所指出的,这需要一个至少与“txt”字符串一样长的密钥字符串。否则,您将收到范围检查错误。 (您正在编译范围检查,对吗?)

编辑:不确定转换时为什么>> 4 and 0x0f位。我没有Java编译器,所以它可能只是一个语言问题,但它看起来像这样的位移将始终在字母字符的0..3内产生结果,并且也使得无法逆转该过程,这通常是 xor 加密的全部要点。如果您不需要保持与此Java算法的兼容性,我会将数字行替换为:

digit := intToHex(ch, 2);

这将为您提供更正确和可逆的结果。

EDIT2:好的,当我写这篇文章的时候,早上有点太早了。我完全错过了两次调用GetHexDigit的事实。修正了算法。

答案 1 :(得分: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'