Problemas ao converter de Hexa para char

6 respostas
paulokarol

Amigos, tenho uma rotina que converte hexa para char utilizando o metodo hexToChar. Mas esta acontecendo alguns problemas quando as palavras tem acentos ou “ç”. Vou dar exemplos:

CONVERTIDO ORIGINAL
CAMBÉ (EAR CABUNI cb CAB04) CAMBÉ (EAR CABUNI CB CAB04)
SÃO FRANCISCO - EXPOSIÇÃO SÃO FRANCISCO - EXPOSIÇÃO

alguem sabe o porque ou tem alguma dica de como fazer essa conversão correta?

agradeço desde já.

6 Respostas

T

Isso é problema de codificação (conversão caracter Unicode &lt-&gt byte).

No seu caso, se você converter a string para byte usando a codificação ISO-8859-1 (veja o método toByteArray) , vai obter os códigos esperados (do Windows). No seu caso, Ã (que em Unicode é \u00C3) vai ser convertido para C3, como esperado.

paulokarol

Agradeço a ajuda amigo, mas nao consegui fazer isso funcionar, vou postar meu codigo:

public String convertHex (String pText) throws Exception
{

	if (pText.length() > 2 && pText.substring(0, 2).equals("0x"))
    {
        String wBuffer = "";

        // Ignores the first 2 characters   
        pText = pText.substring(2); 

        // Converts Hex to String
        for (int i = 0; i < pText.length(); i = i + 2)
		{
            wBuffer = wBuffer + (char) Integer.parseInt( pText.substring( i, i + 2  ), 16 );
           
	    }
                
        return new String (wBuffer.getBytes(), "ISO-8859-1");
    }
    else
    {
       return pText; 
    }     
}

Não sei exatamente setar a codificação para ISO-8859-1, desse jeito as palavras ate vem mais certas, mas sempre ven sujeira. Agradeceria muito se podesse me mostrar como fazer isso.

Muito Obrigado

T

Vamos lá.
Pra começar, bytes são bytes e caracteres são caracteres. Então o seu código já tem problemas conceituais.
Você poderia me passar um exemplo de string em hexadecimal (com acentos, cedilhas e outras tranqueiras) que você está tentando converter? É melhor que você simplesmente postar o que está dando errado.

paulokarol

Ok, vamos lá então:

este é o código hexa:
0x494249504F52C3832020202020202020202020202020

este é o que meu código gera:
CAMBÃ?

este é a string correta:
CAMBÉ

Obrigado por estar me ajudando.

T

Bom, você me passou o código para IBIPORÃ, mas não tem problema.

class TesteHexString {
    public static void main(String[] args) throws Exception {
        //              I B I P O R <Ã>
        String hex = "0x494249504F52C3832020202020202020202020202020";
        // Pela codificação, isto é UTF-8, não ISO-8859-1. Em UTF-8, o caracter \u00C3 é 
        // convertido para 2 bytes: C3 83.
        if (hex.startsWith ("0x") || hex.startsWith ("0X")) 
            hex = hex.substring (2); // removo o "0x"
        int nBytes = hex.length() / 2; 
        byte[] bytes = new byte [nBytes];
        for (int i = 0; i &lt nBytes; ++i) {
            bytes[i] = (byte) Integer.parseInt (hex.substring (i * 2, i * 2 + 2), 16);
        }
        // Agora vamos converter em uma string
        String str = new String (bytes, "UTF-8");
        // Para mostrar, se for no Windows, configure a fonte do console para Lucida Console
        // e execute o comando CHCP 1252 antes de chamar este programa com java -cp . TesteHexString.
        System.out.println (str);         
    }
}
paulokarol

Beleza cara, é depois que te mandei foi que vi que tava errada mas como ela também tinha “ã” eu deixei.

Testei o código, deu certo. Muito obrigado mesmo pela ajuda!!

E também vi meu erro, eu tava convertendo pra char onde devia converter para byte, agora entendi o que voce havia falado.

Criado 30 de agosto de 2006
Ultima resposta 31 de ago. de 2006
Respostas 6
Participantes 2