我需要将此代码转换为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 :(得分: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'