1

如何将 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));
}       

但结果不同。

键1 = 11,键2 = 22,键3 = 33;

value : "ABCDE"
delphi encrypt : 4144DB69BF
java encrypt   : 4144DB0901

不匹配

value : "ABC"
delphi encrypt : 4144DB
java encrypt   : 4144DB

是一致的

为什么不匹配长?

4

1 回答 1

3

有两个明显的错误。

首先,更新key1must userValue而不是bValue.

其次,Delphi 代码在2 字节无符号整数key1的上下文中执行算术运算。Word但是 Java 代码在int4 字节有符号整数的上下文中执行相同的计算。

要解决这个问题,我相信您只需要使用 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

在更一般的说明中,由于您有两个代码,您应该安排两个代码在组织上尽可能接近。然后打印出尽可能多的诊断信息,以查明首次出现差异的计算步骤。

于 2013-04-08T18:28:38.177 回答