如何将用Delphi编写的特定代码转换为JAVA?
Delphi代码是加密代码。
function Encrypt(const S: String; Key1, Key2, Key3: WORD): String;
var
i: Byte;
FirstResult: String;
begin
SetLength(FirstResult, Length(S));
for i:=1 to Length(S) do begin
FirstResult[i]:=Char(Byte(S[i]) xor (Key1 shr 8));
Key1 :=(Byte(FirstResult[i])+Key1)*Key2+Key3;
end;
Result:=ValueToHex(FirstResult);
end;
function ValueToHex(const S: String): String;
var i: Integer;
begin
SetLength(Result, Length(S)*2);
for i:=0 to Length(S)-1 do begin
Result[(i*2)+1]:=HexaChar[Integer(S[i+1]) shr 4];
Result[(i*2)+2]:=HexaChar[Integer(S[i+1]) and $0f];
end;
end;
所以我试着制作源代码。它在这里
int key1=11; int key2=22; int key3=33;
String value = "ABCDE";
for(int i=0; i< value.length(); i++){
byte[] bValue = value.substring(i).getBytes();
int[] rValue = {0};
rValue[0] = bValue[0]^(key1>>8);
key1 = (bValue[0]+key1)*key2+key3;
System.out.print(ValueToHex(rValue));
}
但结果不同。
key1 = 11,key2 = 22,key3 = 33;
value : "ABCDE"
delphi encrypt : 4144DB69BF
java encrypt : 4144DB0901
不匹配
但
value : "ABC"
delphi encrypt : 4144DB
java encrypt : 4144DB
是否一致
为什么不匹配长?
答案 0 :(得分:3)
有两个明显的错误。
首先,key1
的更新必须使用rValue
而不是bValue
。
其次,Delphi代码在key1
的上下文中对Word
执行算术,这是一个2字节的无符号整数。但是Java代码在int
的上下文中执行相同的计算,这是一个4字节的有符号整数。
要解决此问题,我相信您只需要使用4字节签名执行算法,然后将key1
截断为2字节值。像这样:
key1 = ((rValue[0]+key1)*key2+key3) & 0xffff;
我还认为您可以大大简化Java代码。我对Java几乎一无所知,所以我确信熟练的Java专家可以做得比这更好:
class SO15885898 {
private static String ValueToHex(int myInt)
{
StringBuilder sb = new StringBuilder();
sb.append(Integer.toHexString(myInt & 0xff));
if (sb.length() < 2) {
sb.insert(0, '0'); // pad with leading zero if needed
}
return sb.toString();
}
public static void main(String[] args)
{
int key1=11;
int key2=22;
int key3=33;
String value = "ABCDE";
for(int i=0; i<value.length(); i++){
byte bValue = value.substring(i).getBytes()[0];
int rValue = bValue^(key1>>8);
key1 = ((rValue+key1)*key2+key3) & 0xffff;
System.out.print(ValueToHex(rValue));
}
}
}
输出:
4144db69bf
更一般地说,既然你有两个代码,你应该安排两个代码在组织中尽可能彼此接近。然后打印尽可能多的诊断信息,以确定首先出现差异的计算步骤。