Converter função Pascal(Delphi) para JAVA [RESOLVIDO]

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;

Interessante… qual a dúvida?

Bom dia.

Você simplesmente quer que eu alguém que entenda de Delphi, pegue seu código, traduza para Java e o entregue á você?! :slight_smile:
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? :slight_smile:

Se esforça amigo, se queres aprender algo é só assim.
Abraços.

Converter essa função para o JAva ja andei procurando alguma coisa mas não consegui, tentei dessa forma

	public static String EncryptPassword(String Pass)
	{		
//		S := S + #13 + '          ';
		Pass = Pass + "\n" + "          ";
//		Cod := '';
		String Cod = ""; 

//		for I := 9 downto 1 do
		for(int i = 9; i>1 ; i--)		
//			Cod := Cod + Copy(S, I, 1);
			Cod = Cod + Pass.substring(i, 1);

//		S := Copy(Cod, 4, 3) + Copy(Cod, 1, 3) + Copy(Cod, 7, 3);
		Pass = Cod.substring(4, 3) + Cod.substring(1, 3) + Cod.substring(7, 3);
//		Cod := '';
		Cod = "";	

//		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;
	}

[quote=savoine]Converter essa função para o JAva ja andei procurando alguma coisa mas não consegui, tentei dessa forma

[code]
public static String EncryptPassword(String Pass)
{
// S := S + #13 + ’ ';
Pass = Pass + “\n” + " ";
// Cod := ‘’;
String Cod = “”;

// for I := 9 downto 1 do
for(int i = 9; i>1 ; i–)
// Cod := Cod + Copy(S, I, 1);
Cod = Cod + Pass.substring(i, 1);

// S := Copy(Cod, 4, 3) + Copy(Cod, 1, 3) + Copy(Cod, 7, 3);
Pass = Cod.substring(4, 3) + Cod.substring(1, 3) + Cod.substring(7, 3);
// Cod := ‘’;
Cod = “”;

// 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?

Abraços.

Da essa mensagem:

java.lang.StringIndexOutOfBoundsException : String index out of range: -8

[quote=savoine]Da essa mensagem:

java.lang.StringIndexOutOfBoundsException : String index out of range: -8[/quote]

Aposto que seu erro está por aqui:

for(int i = 9; i>1 ; i--)           
   Cod = Cod + Pass.substring(i, 1);   

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?

Altere seu for, assim:

for(int i = pass.lenght; i>1 ; i--)           
   Cod = Cod + Pass.substring(i, 1);  

Em Java, por padrão, se dá nomes a variavéis com sua primeira letra em minusculo, por isso troquei o Pass por pass.
Teste e nos diga como foi:)

Abraços.

Fiz a mudança como voce informou e continua dando a mensagem de erro, mas agora mudou a posição.

java.lang.StringIndexOutOfBoundsException : String index out of range: -17

	public static String EncryptPassword(String pass)
	{		
		pass = pass + "\n" + "          ";
		String cod = ""; 

		for(int i=pass.length(); i>1 ; i--) 
			cod = cod + pass.substring(i, 1);

		pass = cod.substring(4, 3) + cod.substring(1, 3) + cod.substring(7, 3);
		cod = "";	

		for(int i=1 ; i>9; i++)		   	
	    {		  
	    	int ord = pass.charAt(i);
	    	if ((i%2) == 0)
	    	{   
	    		if (ord == 255) 
	    			cod = cod + 0;
			    else
			        cod = cod + (char)(ord + 1);			    	
	    	}
			else
			{
				if (ord == 0)
					cod = cod + (char)(255);
			    else
			    	cod = cod + ((char)(ord - 1));
			}
	    }    
		return cod;
	}

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.

Abraços.

não seria melhor usar o md5 ?

Mesmo problema.

java.lang.StringIndexOutOfBoundsException : String index out of range: -16

não seria melhor usar o md5 ? [2]

[quote=savoine]Mesmo problema.

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?

Abraços.

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=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.

Abraços.

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;
	}