Pessoal sou newbie em Java e estou migrando meu aplicativo feito dem Delphi para uma aplicação em Flex + Java e precisava converter essa função de criptografia em Java, segue abaixo o codigo.
function EncryptPasswd(S: string): string;
var
Cod: string;
I: integer;
begin
S := S + #13 + ' ';
Cod := '';
for I := 9 downto 1 do
Cod := Cod + Copy(S, I, 1);
S := Copy(Cod, 4, 3) +
Copy(Cod, 1, 3) +
Copy(Cod, 7, 3);
Cod := '';
for I := 1 to 9 do
begin
if (I mod 2) = 0 then
begin
if ord(S[I]) = 255 then
Cod := Cod + #0
else
Cod := Cod + chr(ord(S[I]) + 1);
end
else
begin
if ord(S[I]) = 0 then
Cod := Cod + chr(255)
else
Cod := Cod + chr(ord(S[I]) - 1);
end;
end;
EncryptPasswd := Cod;
end;
Você simplesmente quer que eu alguém que entenda de Delphi, pegue seu código, traduza para Java e o entregue á você?!
Muito fácil né?
Já estudou alguma apostia gratuita de Jav? Leu um livro? Enfim, buscou meios de aprender o que são métodos, modificadores de acesso entre outros em Java?
Melhor, sabe o que é uma classe? Um objeto?
Se esforça amigo, se queres aprender algo é só assim.
Abraços.
// for I := 1 to 9 do
for(int i =1 ; i > 9 ; i ++)
// begin
{
int ord = Pass.charAt(i);
// if (I mod 2) = 0 then
if ((i % 2) == 0)
// begin
{
// if ord(S[I]) = 255 then
if (ord == 255)
// Cod := Cod + #0
Cod = Cod + 0;
else
// Cod := Cod + chr(ord(S[I]) + 1);
Cod = Cod + (char)(ord + 1);
// end
}
else
// begin
{
// if ord(S[I]) = 0 then
if (ord == 0)
// Cod := Cod + chr(255)
Cod = Cod + (char)(255);
else
// Cod := Cod + chr(ord(S[I]) - 1);
Cod = Cod + ((char)(ord - 1));
}
// end;
// end;
}
// EncryptPasswd := Cod;
return Cod;
}
[/code][/quote]
Já está muito melhor, recomendo você tirar os comentários com fragmentos de código Delphi, fica mais claro.
Agora, conte-nos, o que houve de errado? Gera uma exceção ou o resultado obtido está errado?
O problema de se utilizar um substring com valores fixos é que você tem que testar o tamanho da String quando fores realizar um substring dessa forma.
Possivelmente, a sua String possui um tamanho ao inferior ao passado para a variavél “i”. É como se você estivesse tentando acessar a posição de número 8 da string, sendo que ela não existe, termina em 7, entende?
Ops!
Tente (pass.lenght() -1). (No seu for, é claro).
A string tem tamanho 17, mas começa em 0, ou seja, 0…1, por isso não encontrou a posição 17.
Aii eu digo agora para usar pass.lenght -1, assim fica correto.
java.lang.StringIndexOutOfBoundsException : String index out of range: -16[/quote]
Simples, não prestei a devida atenção.
O substring não permite que você comece em um valor maior que o fim.
Ou seja, (2,1), (5, 1) e por ai em diante.
Pensando bem rápido, veja se invertando sua string e alterando o substring no seu for para (1, i) não resolve.
Falando nisso, esse era o objetivo? Inverter a String?
[quote=jamirdeajr]Acho que o erro pode ser devido as diferenças do método substring entre java e delphi.
No java os parâmetros são posição inicial (partindo de zero) e posição final,
no Delphi é posição inicial (partindo de 1) e número de caracteres.
Então, por exemplo,
//Em Delphi
substring(7,3)
// Em java fica
substring(6,8); //
[/quote]
Tá ai o motivo de eu ter dito a ele para estudar.
Eu não fazia a menor idéia de que era assim que funcionava o método subString() do Delphi.
É uma diferença crucial, suficiente para causar problemas.
Pessoal andei pesquisando alguns exemplos na internet e vi que o Delphi trabalha diferente do Java em relação a espaços de uma string (pelo menos pelos testes que tentei fazer)
Abaixo segue código feito em Delphi e depois no JAVA
Delphi
function EncryptPasswd(pass: string): string;
const
key: LongInt = 0000;
addPass: string = 'XXX';
var
pos: Byte;
invert_pass: string;
cod: string;
begin
Result := '';
invert_pass := ReverseString(pass + addPass);
cod := Copy(invert_pass, 5, 4) + Copy(invert_pass, 1, 4) + Copy(invert_pass, 9,1);
for pos := 1 to Length(cod) do
Result := Result + CHAR(Byte(cod[pos]) xor (key shr 8 ) xor (1 xor 3));
end;
JAVA
public static String EncryptPassword(String pass)
{
String result = "";
long key = 0000;
String addPass = "XXX";
StringBuffer invert_pass = new StringBuffer(pass+addPass).reverse();
String cod = "";
cod = invert_pass.substring(4,8) + invert_pass.substring(0, 4) + invert_pass.substring(8,9);
for (int pos = 0; pos < cod.length(); pos ++)
result += (char)((int)cod.charAt(pos) ^ ((key >> 8) ^ (1 ^ 3)));
return result;
}