[RESOLVIDO] StringBuilder com encoding ISO-8859-1

4 respostas
E

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:

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

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?

4 Respostas

E

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)

E

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

E
  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:

E

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;

}
Criado 26 de março de 2013
Ultima resposta 26 de mar. de 2013
Respostas 4
Participantes 2