Enviando um byte "negativo" por UDP

1 resposta
M

Estou convertendo sequencias de oito 1’s e 0’s em um byte. Porém o range do byte em java vai de -128 to 127. Dessa forma, se eu converto uma sequencia que comece com 1 para um byte, como por exemplo 10001100 (140 em decimal), ele vai converter para um valor negativo (no caso 116) e e não vai conseguir converter de volta aos bits 1’s e 0’s depois que for enviado.

Deixa eu colocar códigos e exemplo para ficar mais fácil de se entender.

Servidor: Quando chega um pedido, envia dois bytes (-116 e 50).

public static void main(String args[]) throws SocketException, IOException{
            DatagramSocket serverSocket = new DatagramSocket(53);
            byte[] receiveData  = new byte[512];

            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);

            InetAddress    IPAddress    = receivePacket.getAddress( );
            int port   =   receivePacket.getPort();        
            int i = 140;
            char c = (char)i;
            byte b = (byte) c;
            byte data[] = {b, 50};

            DatagramPacket sendPacket  = new DatagramPacket(data, data.length, IPAddress, port);
            serverSocket.send(sendPacket);
            serverSocket.close();
    }

O valor de c é 140 e o de b é -116.

Cliente: Apenas envia um byte qualquer e recebe a resposta do servidor.

public static void main(String args[]) throws UnknownHostException, SocketException, IOException{
         DatagramSocket clientSocket = new DatagramSocket();
         InetAddress addr = InetAddress.getByName("localhost");
         byte[] b = {1};
        
         DatagramPacket pergunta = new DatagramPacket(b, b.length, addr, 53);
         clientSocket.send(pergunta);
     
         DatagramPacket answer = new DatagramPacket(new byte[512], 512);
         clientSocket.receive(answer);
         
         String msg = new String(answer.getData(), answer.getOffset(), answer.getLength());
         char c = msg.charAt(0);
         char c1 = msg.charAt(1);
         
         System.out.println("Concluido");
    }

Debugando, no final da execução o valor de c1 em decimal é 50 (corretamente) mas o de c é 338 (deveria ser -116).

Alguem tem alguma luz?

1 Resposta

M

Resolvido. O problema estava nessa conversão para String, basta trabalhar diretamente com os bytes que chegam.

Criado 7 de setembro de 2008
Ultima resposta 7 de set. de 2008
Respostas 1
Participantes 1