Escovando Bits

2 respostas
I

Olá. Estou criando um objeto da classe ByteArrayOutputStream em um array de bytes invocando o método toByteArray(). De acordo com a documentação da SUN, este método cria um array de bytes por complemento de 2. Pois bem, como tenho de serializá-lo eu acabo criando um objeto String assim:

final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    //... baos.write(...);
    final String encoded = new String(baos.toByteArray());
    //repassa encoded...

O outro lado da aplicação recebe este String (que é codificado em UTF-16 por default) e pega os bytes novamente:

//...
byte[] buffer = encoded.getBytes();
//...

Então quando comparo os bytes gerados por toByteArray() e o getBytes() alguns dos bytes são diferentes e não consigo deserializar meu objeto. Acredito que o problema seja a maneira como String trata meu array de bytes. Por isso fiz questão de mencionar o esquema do charset (posso estar enganado).

Andei dando mais uma olhada na API e vi que o getBytes() de String pode receber como parâmetro o tipo de codificação. Tentei UTF-8, UTF-16LE, UTF-16BE… e nada.

Quando percorro o array gerado pelo baos, tenho algo assim:

-128, -20, 105, -63, -82, -86, -52, -66, -122, 33, 22, -84, -115, 120, 7, 65, 2, -61, 8, 12, 127,...

Quando percorro o array gerado pelo String, tenho isto:

-128, -20, 105, -63, -82, -86, -52, -66, -122, 33, 22, -84, 63, 120, 7, 65, 2, -61, 8, 12, 127,...

Percebam que o -115 por exemplo é transformado em 63. Estou perdido nesta transição. Alguém tem alguma idéia de como lidar como este problema? O que posso estar fazendo de errado? Grato T+

2 Respostas

J

iktuz,

Experimente isso:

Ao invés de new String(baos.toByteArray()) use baos.toString(UTF-8)

Depois você usa encoded.getBytes(UTF-8)

Ou com o charset que você quiser.

I

Beleza… agora os arrays de bytes tem o mesmo conteúdo. Vai ficar mais fácil recompor o objeto. Valeu a dica! T+

Criado 11 de julho de 2006
Ultima resposta 12 de jul. de 2006
Respostas 2
Participantes 2