这可能就是导致乱码的原因 楼主可以试试下面这种方法:package csdn;public class Test { public static void main(String[] args) { int num = 123; String str = "Hello Java"; char[] c = str.toCharArray(); // 字符串转到字符
String s = num+""; // int -> String char[] cc = s.toCharArray(); // String - > char 即 int - > char 可采用这种间接转换 通过String作为桥梁来实现 } }
谁能帮翻译下这个delphi的解密程序成JAVA,请吃饭,另附上我自己翻译的,有错误的JAVA源码。 下面是delphi程序: unit SkCrypt; interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, ToolWin, Buttons, db, HTTPApp, DBClient, MConnect, SConnect, Psock, NMFtp, NMUDP,Clipbrd, FileCtrl,PMDbAgt,ReadSysConfig, dxmdaset,PMCrypt;function SkEncrypt(s:string):string; function SkDecrypt(s:string):string;implementation const StartKey = 833; {Start default key} MultKey = 38742; {Mult default key} AddKey = 25861; {Add default key} {$R-} {$Q-} {******************************************************* * Standard Encryption algorithm - Copied from Borland * *******************************************************} function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string; var I : Byte; begin Result := ''; for I := 1 to Length(InString) do begin Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8)); StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey; end; end; {******************************************************* * Standard Decryption algorithm - Copied from Borland * *******************************************************} function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string; var I : Byte; begin Result := ''; for I := 1 to Length(InString) do showmessage(inttostr(i)); begin Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8)); //shr 位移运算,将数值转换为二进制,往右位移8次,剩下的二进制数字转换为十进制,得出值; showmessage(Result); StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey; end; end; {$R+} {$Q+}{Coded by cloudy}function cl_bytetocharstr(s:string):string; var i:integer; begin i:=1; result:=''; if (length(s) mod 3)=0 then while i<length(s) do begin result:=result+char(strtoint(copy(s,i,3))); i:=i+3; end; end;{Coded by cloudy} function SkEncrypt(s:string):string; var years, months, days, hours, mins, secs, msec:word; cl_StartKey, cl_MultKey, cl_AddKey: longint;begin if Trim(s)='' then begin Result := ''; exit; end; decodedate(now, years, months, days); decodetime(now, hours, mins, secs, msec); cl_StartKey:=msec; if cl_StartKey<256 then cl_StartKey:=cl_StartKey+256; cl_Multkey:=((years-1900)*12+months)*30+days+cl_StartKey*10+cl_StartKey; cl_AddKey:=(23*hours+mins)*60+secs+cl_StartKey*10+cl_StartKey; result:=cl_chartobytestr(Encrypt(cl_intto0str(cl_StartKey,3),StartKey,MultKey,AddKey))+cl_chartobytestr(Encrypt(cl_intto0str(cl_Multkey,5),StartKey,MultKey,AddKey))+cl_chartobytestr(Encrypt(cl_intto0str(cl_Addkey,5),StartKey,MultKey,AddKey))+cl_chartobytestr(Encrypt(s,cl_StartKey,cl_MultKey,cl_AddKey)); end;{Coded by cloudy} function SkDecrypt(s:string):string; var cl_StartKey, cl_Multkey, cl_AddKey:longint; begin if Trim(s)='' then begin Result := ''; exit; end; cl_StartKey:=strtoint(decrypt(cl_bytetocharstr(copy(s, 1, 9)),StartKey,MultKey,AddKey)); cl_MultKey:=strtoint(decrypt(cl_bytetocharstr(copy(s, 10, 15)),StartKey,MultKey,AddKey)); cl_AddKey:=strtoint(decrypt(cl_bytetocharstr(copy(s, 25, 15)),StartKey,MultKey,AddKey)); result:=decrypt(cl_bytetocharstr(copy(s, 40, length(s)-39)),cl_StartKey,cl_MultKey,cl_AddKey); end; end.下面是我仿做的JAVA程序,供参考和帮我找下错误,因为方法是错的:import java.io.UnsupportedEncodingException; import java.util.Scanner; public class Jiemi { private long StartKey = 833; private long MultKey = 38742; private long AddKey = 25861; public String codein; public String codeout; public String getPassword(String str) { int intStartKey; int intMultKey; int intAddKey; intStartKey= (backback(resultBack(codeBack(str,0,9)),StartKey,MultKey,AddKey)); //System.out.println(backback(resultBack(codeBack(str,0,9)),StartKey,MultKey,AddKey)); intMultKey= (backback(resultBack(codeBack(str,9,24)),StartKey,MultKey,AddKey)); //System.out.println(backback(resultBack(codeBack(str,10,24)),StartKey,MultKey,AddKey)); intAddKey= (backback(resultBack(codeBack(str,24,39)),StartKey,MultKey,AddKey)); //System.out.print(backback(resultBack(codeBack(str,25,39)),StartKey,MultKey,AddKey)); String password = "";//backback(resultBack(codeBack(str,40,40+(str.length()-39))),intStartKey,intMultKey,intAddKey); return password; }
public String codeBack(String str,int i,int k) { //System.out.println("---"+str.substring(i, k)); return str.substring(i, k); } public String resultBack(String str) { String s=""; int i=0; if(str.length()%3==0){ while(i<str.length()){ s = s + integertochar(Integer.parseInt(codeBack(str,i,i+3))); i=i+3; } } return s; } public int backback(String str,long intStartKey,long intMultKey,long intAddKey) { int b=0; int a=0; for(int m=0;m<str.length();m++){ b=(byte)str.charAt(m); int t=(int)(intStartKey>>8); a=a+(char)(b^t); intStartKey= ((byte)str.charAt(m)+intStartKey)*intMultKey+intAddKey; System.out.println("a="+a); } return a; } static char integertochar(int k) { //return Character.toChars(k)[0]; return (char)k; } }
丑陋的depli 不是c风格的 我怎么都觉得丑陋呢 特别是vb
解密方法:SkDecrypt其他的用到就是有用的,没用到就不看了!谢谢!
b=(byte)str.charAt(m);強轉成byte會丟失信息的 int t=(int)(intStartKey>>8);右移8位不需要強轉 a=a+(char)(b^t);
//你说的是:?
String.indexOf();
楼主可以试试下面这种方法:package csdn;public class Test {
public static void main(String[] args) {
int num = 123;
String str = "Hello Java";
char[] c = str.toCharArray(); // 字符串转到字符
String s = num+""; // int -> String
char[] cc = s.toCharArray(); // String - > char 即 int - > char 可采用这种间接转换 通过String作为桥梁来实现
}
}
char(58)值为“冒号”即“:”
char(40)值为“左括号”即“(”
char(5)值为“竖”即“|”这个方法就是把asc码转换为字符,和asc码表对照过了,除了char(5)没有值,其他都是正确的。
上面是delphi中的情况,下面讲在java里面的情况:
(char)58值为“冒号”即“:”
(char)40值为“左括号”即“(”
(char)5值为乱码“□”谢谢了,我先试试楼上的方法。
你好,能不能帮我弄成一个方法?传进int,转为char,谢谢,我自己也在弄。
return (char)i;//超过65536或小于-65536将会失真,比如(65535+97)这个整数将会返回'a'
}
你好,我传5进去,出来还是“□”,而delphi里是“|”,是不是要编码什么的?谢谢!
static char i2c(int c){
return Character.toChars(c)[0];
}
控制字符,是不能打印出來的
return (char)i;//大于等于65536或小于0将会失真,比如(65535+97)这个整数将会返回'a'
//ascii码是0到127,其中0到32和127,是看不见的
}
虽然是7个2进制位就能表示它们,但注意java中的char二进制位有16个
下面是delphi程序:
unit SkCrypt;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ComCtrls, ToolWin,
Buttons, db, HTTPApp, DBClient, MConnect, SConnect, Psock, NMFtp,
NMUDP,Clipbrd, FileCtrl,PMDbAgt,ReadSysConfig, dxmdaset,PMCrypt;function SkEncrypt(s:string):string;
function SkDecrypt(s:string):string;implementation
const
StartKey = 833; {Start default key}
MultKey = 38742; {Mult default key}
AddKey = 25861; {Add default key}
{$R-}
{$Q-}
{*******************************************************
* Standard Encryption algorithm - Copied from Borland *
*******************************************************}
function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;
end;
end;
{*******************************************************
* Standard Decryption algorithm - Copied from Borland *
*******************************************************}
function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString) do
showmessage(inttostr(i));
begin
Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8)); //shr 位移运算,将数值转换为二进制,往右位移8次,剩下的二进制数字转换为十进制,得出值;
showmessage(Result);
StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey;
end;
end;
{$R+}
{$Q+}{Coded by cloudy}function cl_bytetocharstr(s:string):string;
var
i:integer;
begin
i:=1;
result:='';
if (length(s) mod 3)=0 then
while i<length(s) do
begin
result:=result+char(strtoint(copy(s,i,3)));
i:=i+3;
end;
end;{Coded by cloudy}
function SkEncrypt(s:string):string;
var
years, months, days, hours, mins, secs, msec:word;
cl_StartKey, cl_MultKey, cl_AddKey: longint;begin
if Trim(s)='' then begin Result := ''; exit; end;
decodedate(now, years, months, days);
decodetime(now, hours, mins, secs, msec);
cl_StartKey:=msec;
if cl_StartKey<256 then cl_StartKey:=cl_StartKey+256;
cl_Multkey:=((years-1900)*12+months)*30+days+cl_StartKey*10+cl_StartKey;
cl_AddKey:=(23*hours+mins)*60+secs+cl_StartKey*10+cl_StartKey;
result:=cl_chartobytestr(Encrypt(cl_intto0str(cl_StartKey,3),StartKey,MultKey,AddKey))+cl_chartobytestr(Encrypt(cl_intto0str(cl_Multkey,5),StartKey,MultKey,AddKey))+cl_chartobytestr(Encrypt(cl_intto0str(cl_Addkey,5),StartKey,MultKey,AddKey))+cl_chartobytestr(Encrypt(s,cl_StartKey,cl_MultKey,cl_AddKey));
end;{Coded by cloudy}
function SkDecrypt(s:string):string;
var
cl_StartKey, cl_Multkey, cl_AddKey:longint;
begin
if Trim(s)='' then begin Result := ''; exit; end;
cl_StartKey:=strtoint(decrypt(cl_bytetocharstr(copy(s, 1, 9)),StartKey,MultKey,AddKey));
cl_MultKey:=strtoint(decrypt(cl_bytetocharstr(copy(s, 10, 15)),StartKey,MultKey,AddKey));
cl_AddKey:=strtoint(decrypt(cl_bytetocharstr(copy(s, 25, 15)),StartKey,MultKey,AddKey));
result:=decrypt(cl_bytetocharstr(copy(s, 40, length(s)-39)),cl_StartKey,cl_MultKey,cl_AddKey);
end;
end.下面是我仿做的JAVA程序,供参考和帮我找下错误,因为方法是错的:import java.io.UnsupportedEncodingException;
import java.util.Scanner;
public class Jiemi {
private long StartKey = 833;
private long MultKey = 38742;
private long AddKey = 25861;
public String codein;
public String codeout; public String getPassword(String str) {
int intStartKey;
int intMultKey;
int intAddKey;
intStartKey= (backback(resultBack(codeBack(str,0,9)),StartKey,MultKey,AddKey));
//System.out.println(backback(resultBack(codeBack(str,0,9)),StartKey,MultKey,AddKey));
intMultKey= (backback(resultBack(codeBack(str,9,24)),StartKey,MultKey,AddKey));
//System.out.println(backback(resultBack(codeBack(str,10,24)),StartKey,MultKey,AddKey));
intAddKey= (backback(resultBack(codeBack(str,24,39)),StartKey,MultKey,AddKey));
//System.out.print(backback(resultBack(codeBack(str,25,39)),StartKey,MultKey,AddKey));
String password = "";//backback(resultBack(codeBack(str,40,40+(str.length()-39))),intStartKey,intMultKey,intAddKey);
return password;
}
public String codeBack(String str,int i,int k) {
//System.out.println("---"+str.substring(i, k));
return str.substring(i, k);
}
public String resultBack(String str) {
String s="";
int i=0;
if(str.length()%3==0){
while(i<str.length()){
s = s + integertochar(Integer.parseInt(codeBack(str,i,i+3)));
i=i+3;
}
}
return s;
} public int backback(String str,long intStartKey,long intMultKey,long intAddKey) {
int b=0;
int a=0;
for(int m=0;m<str.length();m++){
b=(byte)str.charAt(m);
int t=(int)(intStartKey>>8);
a=a+(char)(b^t);
intStartKey= ((byte)str.charAt(m)+intStartKey)*intMultKey+intAddKey;
System.out.println("a="+a);
}
return a;
}
static char integertochar(int k) {
//return Character.toChars(k)[0];
return (char)k;
}
}
丑陋的depli
不是c风格的 我怎么都觉得丑陋呢
特别是vb
int t=(int)(intStartKey>>8);右移8位不需要強轉
a=a+(char)(b^t);
String str = "abcABC";
char i = str.charAt(0);//得到a这个字符
char[] arr = str.toCharArray(); 楼主说的是它们吗?
这个方法能实现什么?我是想传int进去,返回用char转换过的字符,一定是我java里哪里写错了,或者数据类型没弄好,计算出“???”