Problemas ao converter int para byte

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

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:

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.

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.

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

[quote=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.[/quote]

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