Decodificando dados em Socket

1 resposta
I

Olá pessoal. Estou com problemas para decodificar um stream de dados sobre uma conexão Socket. Crio a conexão da seguinte maneira:

//…

Socket socket = new Socket();

socket.connect(new InetSocketAddress(serverName, serverPort), timeout);

reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int[] values = new int[9];

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

values[i] = reader.read();

System.out.println(values[”+i+"]: " + values[i]);

}

//

Usando um sniffer sei que o que vem da rede é (em hexa):
23 00 f1 10 0b c2 22 92 f4

O problema é como os valores são decodificados (mostrados):

values[0]: 35 (ok)
values[1]: 0 (ok)
values[2]: 241 (ok)
values[3]: 16 (ok)
values[4]: 11 (ok)
values[5]: 194 (ok)
values[6]: 34 (ok)
values[7]: 8217 (AQUI ESTÁ O PROBLEMA, deveria se 146)
values[8]: 244 (ok)

Alguém saberia me dizer porquê o oitavo byte (values[7]) é mostrado como 8217 e não como 146? Como resolver isto?

Grato desde já, T+

1 Resposta

I

Caso alguém se depare com o mesmo problema, fica a solução aí como uma das possibilidades…
Acabei usando SocketChannel para a tarefa. A leitura dos dados é feita por bytes e não por caracteres unicode (int).

SocketChannel channel = SocketChannel.open(new InetSocketAddress(serverName, serverPort));

Socket socket = channel.socket();

//…

DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

dos.write(dataStream); //manda os dados para o server…

//…

Para a leitura dos dados pode-se encontrar um problema, caso o server mande os bytes como não sinalizados (como no meu caso), mas isto resolve-se assim:

ByteBuffer bb = ByteBuffer.allocate(1);

channel.read(bb);

bb.rewind();

byte b = bb.get() //supondo-se b = -120 por exemplo;

int unsignedByte = b & 0xff; //convertendo para um valor positivo

Espero que ajude alguém no futuro. T+

Criado 6 de junho de 2005
Ultima resposta 7 de jun. de 2005
Respostas 1
Participantes 1