将Delphi转换为Java(我的代码是否正确?)

将Delphi转换为Java(我的代码是否正确?),java,delphi,Java,Delphi,我有这个Delphi代码 const C1 = 52845; C2 = 22719; Function Encrypt(const S: String; Key: Word): String; cdecl ; var I: byte; J : Integer; Str : String ; begin Str := S ; for I := 1 to Length(S) do begin J:=byte(S[I]) xor (Key

我有这个Delphi代码

const
  C1 = 52845;
  C2 = 22719;

Function Encrypt(const S: String; Key: Word): String; cdecl ;
var
  I: byte;
  J : Integer;
  Str : String ;
begin
      Str := S ;
      for I := 1 to Length(S) do begin
        J:=byte(S[I]) xor (Key shr 8);
        Str[I] := Char(J);
        Key := (byte(Str[I]) + Key) * C1 + C2;
      end;
      Result:= '';
      for I := 1 to Length(S) do begin
        Result:= Result + StringOfChar('0' , 3 - Length(IntToStr(byte(Str[I]))) ) + IntToStr(byte(Str[I]));
      end;
end;
我想把这段代码转换成java

我写这个

 public static String EncryptePassword(String S,int Key){
        int C1 = 52845;
        int C2 = 22719;

        String Str=S;
        String Result="";
        int J;
        for(int i=0;i<S.length();i++){

            J = (byte) S.charAt(i) ^ (byte) (Key>> 8);
            Str+= (char) J;
            Key=((byte) Str.charAt(i)+Key)*C1+C2;
        }
        for(int i=0;i<S.length();i++){
            Result+=repeat("0",3-String.valueOf( Integer.valueOf((byte) Str.charAt(i))).length())+ (byte) Str.charAt(i);

        }
        return Result;
    }
公共静态字符串加密密码(字符串S,int键){
int C1=52845;
int C2=22719;
字符串Str=S;
字符串结果=”;
int J;
对于(int i=0;i>8);
Str+=(char)J;
Key=((字节)Str.charAt(i)+Key)*C1+C2;
}

对于(int i=0;i代码是不等价的。特别是,Delphi中的这一行:

Str[I]:=Char(J);
正在替换字符串中的字符,而Java中的这一行:

Str+=(char)J;
改为在字符串末尾追加字符

因此,
Str
将产生两种不同的结果

在Java中,字符串是不可变的,您不能修改字符。但是您可以使用旧字符串的片段构造新字符串,然后用新字符串替换旧字符串。或者更好的是,您可以使用StringBuilder

Java的翻译可能更像这样:

private static int C1=52845;
专用静态int C2=22719;
私有静态int-toUnsignedByte(字符c)
{
//在Delphi中,Byte是8位无符号类型,但Java没有
//等效类型。将字符转换为字节会截断该值
//到8位。使用有符号整数并将其值限制为
//与字节相同的范围。。。
//
返回((int)c)&0xFF;
}
公共静态字符串EncryptedPassword(字符串S,整数密钥)
{
//在Delphi中,Word是一种16位无符号类型,但Java没有
//等效类型。使用有符号整数并限制其值
//与一个单词的范围相同。。。
//
如果((键<0)或(键>0xFFFF))
抛出新的IllegalArgumentException(“键在值的有效范围之外”);
int J;
StringBuilder Str=新的StringBuilder;
对于(int I=0;I>8);
塞查拉特(I,(char)J);
键=((toUnsignedByte(Str.charAt(I))+键)*C1+C2)和0xFFFF;
}
StringBuilder结果=新的StringBuilder(S.length()*3);
对于(int I=0;I
但是,需要记住的另一点是,在Delphi 2007和更早版本中,
String
是一个8位Ansi字符串,但在Delphi 2009和更高版本中,它是一个16位Unicode字符串。Java字符串是16位Unicode。您没有说您尝试从哪个版本的Delphi移植代码,但是如果它是Ansi版本,那么transl可能更像这样:

private static int C1=52845;
专用静态int C2=22719;
私有静态int-toUnsignedByte(字节b)
{
//在Delphi中,Byte是8位无符号类型,但Java没有
//一个等价类型。将AnsiChar强制转换为一个字节将保留该值
//8位。使用有符号整数并将其值限制为
//与字节相同的范围。。。
//
返回((int)b)&0xFF;
}
公共静态字符串EncryptedPassword(字符串S,整数密钥)
{
//在Delphi中,Word是一种16位无符号类型,但Java没有
//等效类型。使用有符号整数并限制其值
//与一个单词的范围相同。。。
//
如果((键<0)或(键>0xFFFF))
抛出新的IllegalArgumentException(“键在值的有效范围之外”);
字节[]Str=S.getBytes();/>8);
Str[I]:=(字节)J;
Key=((toUnsignedByte(Str[I])+Key)*C1+C2)和0xFFFF;
}
StringBuilder结果=新StringBuilder(Str.length*3);
对于(int I=0;I
该代码不等效。尤其是Delphi中的这一行:

Str[I]:=Char(J);
正在替换字符串中的字符,而Java中的这一行:

Str+=(char)J;
改为在字符串末尾追加字符

因此,
Str
将产生两种不同的结果

在Java中,字符串是不可变的,不能修改字符。但您可以使用旧字符串的片段构造新字符串,然后用新字符串替换旧字符串。或者更好,您可以使用StringBuilder

Java的翻译可能更像这样:

private static int C1=52845;
专用静态int C2=22719;
私有静态int-toUnsignedByte(字符c)
{
//在Delphi中,Byte是8位无符号类型,但Java没有
//等效类型。将字符转换为字节会截断该值
//到8位。使用有符号整数并将其值限制为
//与字节相同的范围。。。
//
返回((int)c)&0xFF;
}
公共静态字符串EncryptedPassword(字符串S,整数密钥)
{
//在Delphi中,Word是一种16位无符号类型,但Java没有
//等效类型。使用有符号整数并限制其值
//与一个单词的范围相同。。。
//
如果((键<0)或(键>0xFFFF))
抛出新的IllegalArgumentException(“键在值的有效范围之外”);
int J;
StringBuilder Str=新的StringBuilder;
对于(int I=0;I>8);
塞查拉特(I,(char)J);
键=((toUnsignedByte(Str.charAt(I))+键)*C1+C2)和0xFFFF;
}
StringBuilder结果=新的StringBuilder(S.length()*3);
对于(int I=0;I
但是,还需要记住的是,在Delphi2007及更早版本中,
String
是一个8位的Ansi字符串,但在Delphi2009及更高版本中是一个16位的字符串