Encoding num vetor de byte

9 respostas
homisinho

Pessoal, realmente fiquei ate com medo depois que vi esse problema. Eu vou fazer um codigo de exemplo aqui e queria ver a forma mais correta e facil de corrigir esse problema.

ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] array = new byte[10];
.
.
for( i...{
.
.
array[i] = (8*16)+0;
array[i+1] = (9*16)+0;
.
.
}
out.write(array);

Eu tenho um pequeno problema que é o encoding, pois ta gravando valores q n tem nada a ver no meu ByteArrayOutputStream, que é um arquivo;
Sei que devo mudar o encoding para ISO-8859-1, mas qual a forma mais correta? Vou ter q utilizar String??

9 Respostas

T

Quais são os valores que não têm nada a ver? Parece que está tudo OK.

(Como é que você copia o ByteArrayOutputStream para o tal arquivo, hein? O problema deve estar lá.)

homisinho

Ola thigol, obrigado pela prontidão na resposta!
mas realmente o problema esta ate no meu vetor de bytes…
e depois é claro na hora de passar ele para o meu ByteArrayOutputStream…

faça o seguinte teste…

byte[] array = new byte[10];
       array[0]=(byte)(8*16);
       array[1]=(byte)(9*16);
       array[2]=(byte)(10*16);

Depure o programa e veja que os valores dentro do array n são 128,144 e 160…

T

Uai, mas esse é o valor esperado. Em hexadecimal, esses valores (128, 144 e 160) são, respectivamente, 0x80, 0x90 e 0xA0.
O que você esperava?

homisinho
ByteArrayOutputStream out = new ByteArrayOutputStream();
                        ////cria dados do arquivo....
                        byte[] array = new byte[200];
                        array[0]= (byte) TrabWords.getHI(equip.getvalor1());
                        array[1]= (byte) TrabWords.getLOW(equip.getvalor2());
                        array[2]= (byte) TrabWords.getHI(equip.getvalor3());
                        array[3]= (byte) TrabWords.getLOW(equip.getvalor4());
                        array[79]= (byte) TrabWords.getLOW(equip.getvalor5());
                        array[100] = (char)13;
                        array[101] = (char)10;
                        out.write(array);
                         for (Iterator<C> it = cx.iterator(); it.hasNext();) {
                             C ca = it.next();
                             i = (ca.getNumero()*16)+objeto.getValor(); //1,2,3 ..funciona 144 n funciona...
                                out.write(0);
                                out.write(i);
                                out.write(objeto.getValor1());
                                out.write(objeto.getValor2());
                                out.write(objeto.getValor3());
                                .
                                .
                                

                         }
                        FileOutputStream o = new FileOutputStream(file);
                        String fileContent = new String(out.toByteArray());
                        o.write(fileContent.getBytes());
                        o.flush();
                        o.close();

Eu tenho problemas somente quando vou colocar algum valor como por exemplo 144.
sei que o problema esta no encoding. Mas n sei como Resolver?

T

Troque

String fileContent = new String(out.toByteArray());

por (não se esqueça de pôr os “try/catch” adequados):

String fileContent = new String(out.toByteArray(), "ISO-8859-1");
homisinho

Pois é thingol tentei o codigo que vc me passou mas n adiantou onde deveria estar 128 no arquivo possuia 63…
todos os outros valores estavam ok… menos os valores 128, 144 e alguns outros…

homisinho

Fiz um novo teste usando FileWriter:

// o true significa q o arquivo será constante FileWriter x = new FileWriter(Configuracao.getCaminhoserv() +"rararo.txt",true); x.write(8); // armazena o texto no objeto x, que aponta para o arquivo x.write(9); // armazena o texto no objeto x, que aponta para o arquivo x.write(144); // armazena o texto no objeto x, que aponta para o arquivo x.write(8); // armazena o texto no objeto x, que aponta para o arquivo x.close(); // cria o arquivo JOptionPane.showMessageDialog(null,"Arquivo gravado com sucesso","Concluído",JOptionPane.INFORMATION_MESSAGE);

Deu o mesmo erro, n tenho nenhuma dúvida q a forma de resolver isso é bem simples, mas n estou encontrando!!!

T

Não use FileWriter para gravar bytes. Use FileOutputStream, que não deve ter tal problema com encodings. OK?

homisinho

Resolvido, depois de um dia de testes… :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

String fileContent = new String(out.toByteArray(),"ISO-8859-1");
                        o.write(fileContent.getBytes("ISO-8859-1"));
Criado 2 de junho de 2009
Ultima resposta 2 de jun. de 2009
Respostas 9
Participantes 2