将Delphi转换为Java(我的代码是否正确?)
我有这个Delphi代码将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
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位的字符串