[RESOLVIDO] StringBuilder com encoding ISO-8859-1

Guys,

Não encontrei nenhum tópico a respeito que me ajudasse, assim, tive que abrir o que vos lê agora…

Eu tenho um método que encripta uma String, conforme podem ver abaixo:

[code]public static byte[] encript(String param) throws EncryptorException{

	try {						
							
		StringBuilder builder = new StringBuilder();						
		
		char[] chars = param.toCharArray();
					
		for(char c : chars){
			
			int code = (int)c;
			
            if (code >= 97 && code <= 122)
                if (code == 122){
                	builder.append((char)(code + 38));
            		
                }else
                    if (code == 105 || code == 106){
                    	builder.append((char)(code + 22));
                    	
                    }else
                        if(code == 109){
                        	builder.append((char)(code + 48));
                        	
                        }else{
                        	builder.append((char)(code - 96));
                        	
                        }                                
            
            if (code >= 224 && code <= 252){
            	builder.append((char)(code - 128));
            	
            }

            if (code >= 48 && code <= 57)
                if (code >= 54 && code <= 57){
                	builder.append((char)(code + 87));
                	
                }else
                    if (code == 53){
                    	builder.append((char)(code + 76));
                    	
                    }else{
                    	builder.append((char)(code - 21));
                    	
                    }
            
		}												
														            
        return builder.toString().getBytes("ISO8859_1");
		
	} catch (Exception e) {
		// TODO: handle exception
		throw new EncryptorException(e.getMessage());
	}		         				
	
}[/code]

O método me retorna um byte[] com os valores 5,4,19,15,14,29,27,27,-112, sendo que o correto seria 5,4,19,15,14,29,27,27,144. Acredito que o problema esteja no encoding, onde no Java, o padrão é o UTF8, sendo que precisamos utilizar o padrão ISO-8859-1. E mesmo usando “getBytes(“ISO8859_1”)”, ainda vem com o valor errado…

Alguém tem algumas luz? Como por exemplo, criar um StringBuilder que construa de fato uma String em ISO88591?

Uma coisa que vou amaldiçoar sempre é o fato do James Gosling ter definido o tipo de dados “byte” no Java como sendo o “signed char” do C, não o “unsigned char” do C.

Portanto, ele vai de -128 a +127, não de 0 a +255 como você está achando. O valor 144 não é um byte, mas pode ser convertido para um usando-se:

(byte) (144 & 0xFF)

Seria interessante então usar um ByteBuffer ao invés do String Builder?

  1. Converta a sua string em um byte[] usando toByteArray (escolha a codificação adequada para seu problema…)

  2. Processe o byte[] com sua função de criptografia (a rigor, o que você fez não é exatamente “criptografia” mas…)

Não precisa usar ByteBuffer - na maior parte do tempo, se você começa a usar algo no pacote java.nio, está fazendo errado :slight_smile:

Então que resolvi o problema. No método de decript, foi preciso fazer o cast de cada byte desta forma:


byte[] param;

int code;

for (int i = 0; i < param.length; i++) {

code = (int) param[i] & 0xFF;

}