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

2 回答 2

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;

爪哇版:

xorString("STACKOVERFLOWCOM", "ASDFQWERTYKMLYDR")
 => 给出“120705051A181317061F07021B1A0B1F”

德尔福版本:

XorString('STACKOVERFLOWCOM', 'ASDFQWERTYKMLYDR')
 => 给出'120705051A181317061F07021B1A0B1F'
于 2010-02-19T13:29:32.867 回答
3

这样做非常简单,真的。它采用输入字符串和键并将它们异或在一起,然后将结果作为十六进制数字流返回。这是德尔福等价物:

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 范围内产生字母字符的结果,并且也无法逆转该过程,这通常是或加密的全部内容。如果您不需要保持与此 Java 算法的兼容性,我会将数字行替换为:

digit := intToHex(ch, 2);

这会给你一个更正确和可逆的结果。

EDIT2:好的,当我写那篇文章时,早上做繁重的逻辑有点太早了。我完全错过了它两次调用 GetHexDigit 的事实。修正了算法。

于 2010-02-19T13:21:38.627 回答