Problemas ao converter int para byte

5 respostas
T

Ola pessoal, estou fazerndo um programa aki q ele converte um int em um byte porem para numeros pqnos como 97 ou 100 ele converte porem numeros maiores (65288) nao, no caso ele converte tudo errado e com alguns sinais de -, preciso converter para poder enviar via socket para um programa em c++

veja meu codigo:

public void sendMsg(Mensagem msg1) throws UnsupportedEncodingException{

ByteBuffer bufferInt=ByteBuffer.allocate(12);
        ByteOrder ordem = ByteOrder.LITTLE_ENDIAN;
        bufferInt.order(ordem);
        bufferInt.putInt(msg1.getTamanho());
        //bufferInt.putLong(msg1.getId());
        //bufferInt.put(intToFourBytes(65288, false));
        bufferInt.putInt(65288); 
        byte[] msgTotal=new byte[12];
        msgTotal=bufferInt.array();
try {
            System.out.println("Mensagem: "+msgTotal[0]+msgTotal[1]+msgTotal[2]+msgTotal[3]+" "+msgTotal[4]+msgTotal[5]+msgTotal[6]+msgTotal[7]);
            envio(msgTotal);
        } catch (SocketException ex) {
            Logger.getLogger(ConexaoLinux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnknownHostException ex) {
            Logger.getLogger(ConexaoLinux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ConexaoLinux.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

e a funcao q envia eh esta:

private void envio(byte[] bytes) throws SocketException, UnknownHostException, IOException{
        DatagramSocket s = new DatagramSocket();            //udp
        InetAddress adr=InetAddress.getByName("192.168.56.2"); //udp

        DatagramPacket question = new DatagramPacket(bytes, bytes.length,adr,30000); //udp

        s.send(question); //udp

    }

qm souber algo ajudaria muito

vlw

5 Respostas

D

Cara, posso estar viajando (viajando longe mesmo…). Vou chutar uma sugestão…
Eu acho que para transmitir um inteiro, você vai precisar converter ele para String antes, depois fazer a conversão para um array de bytes, fazer a transmissão e depois recuperar o array e converter para String e depois para Inteiro…ufa… :shock:

Mas como não manjo nada de transmissão de mensagens por socket…então, pode ser uma viagem das boas… :lol:

X

O que o java está fazendo está correto, ele está quebrando o valor 65288 nos valores 8 e -1

Vamos considerar que um int tenha somente 16 bits em java, ao invés de 32 para facilitar

O valor 65288 é igual a 1111 1111 0000 1000 em binário
dividindo os dois bytes eu tenho
0000 1000 = a 8 decimal
1111 1111 = a -1

Acontece que byte em java vai de -128 até 127. O byte está em complemento de dois, ou seja o bit mais significativo indica o sinal, no caso 1111 1111 = -1, se não estivesse em complemento de 2, ou seja se não tivesse sinal seria igual a 255.

Se você enviar isso via socket e a variavel do outro lado for sem sinal vai entender isso como 255! que está correto também.

V

Pior que eu já falei para ele não imprimir bytes diretamente, mas aparentemente ele não acreditou. Eu já tinha explicado que o formato do java é com sinal, e que não adianta olhar valores decimais…

Também sugeri que ele usasse o wireshark para ler do canal, mas ele também não deu ouvidos.

Na verdade, mesmo que ele queira imprimir no console, também passei um link de uma classe que gera o dump do ByteBuffer, e lida com tipos sem sinal, mas aparentemente ele não quer usa-la também.

Então, sugiro fortemente que você siga as dicas dos colegas, antes de abrir novos tópicos para as mesmas dúvidas.

T

blz pessoal eu segui oq o Vini disse porem é meio dificil conceguir instalar programas aki por isso demorei para colocar o wireshark, o meu erro foi q do lado do c nao estava lendo a quantidade de bytes certos por isso dava errado,

na questao de transformar em string para dpois mandar funciona porem ao receber tem q fazer todo o processo inverso novamente, dai eu acho q mexer com string em c eh mais dificil q int,

mas enfim, desculpa ficar mandando mtas mensagens, eh q sou novo ainda mas estou aprendendo com meus erros,

obrigado pela ajuda de todos!

vlw

X

ViniGodoy:
Pior que eu já falei para ele não imprimir bytes diretamente, mas aparentemente ele não acreditou. Eu já tinha explicado que o formato do java é com sinal, e que não adianta olhar valores decimais…

Também sugeri que ele usasse o wireshark para ler do canal, mas ele também não deu ouvidos.

Na verdade, mesmo que ele queira imprimir no console, também passei um link de uma classe que gera o dump do ByteBuffer, e lida com tipos sem sinal, mas aparentemente ele não quer usa-la também.

Então, sugiro fortemente que você siga as dicas dos colegas, antes de abrir novos tópicos para as mesmas dúvidas.

Bah! Fiquei até com pena… :shock:
Respingou até aqui. :lol:

Criado 21 de janeiro de 2011
Ultima resposta 21 de jan. de 2011
Respostas 5
Participantes 4