Conversões de tipos em C para Java

Galera estou com uma duvida que não consigo solucionar, assim vou mostrar todo o contesto:

Tenho uma aplicação que se comunica via socket, utilizando um protocolo criado por nós para comunicação, porém, o mesmo foi enxugado para melhor o desempenho no envio e recebimento dos dados binários. Ate aqui tudo ok
Porém, existe algumas coisas em C que não consigo fazer em Java. Tipo:
C: int = 2 bytes
Java: int = 4 bytes
OBS: Esse eu consigo converter para dois bytes utilizando essa regra:
Trasformar em 2 bytes

byte[] bytes = new byte[2];
bytes[0] = (byte)('O inteiro' & 0xFF);
bytes[1] = (byte)(('O inteiro' >> 8) & 0xFF); 

Resultado byte[2] que é o inteiro em C.

Código para o inverso

public int getInt( int indice ) {

        int i_aux1 = bytes[indice];
        int i_aux2 = bytes[indice+1];

        //..soma 256 pois nao existe unsigned no java
        if( i_aux1 < 0 )
            i_aux1 += 256;

        //..soma 256 pois nao existe unsigned no java
        if( i_aux2 < 0 )
            i_aux2 += 256;

        int result = i_aux1 + i_aux2*256;

        return result;
    }

A mesma coisa para um Long aumentando a quantidade de byte para 4 e os valores 16 e 32
Mas meu maior desafio é conseguir colocar dentro de um char, 8 bits em binário, pois, em C um char = 1 byte = 8 bits, assim, teria condições de colocar um valor de 00 a 99 dentro de um char, como a liguagem C faz, sem nenhum problema.

Gostaria de uma forçinha quanto a isso …

Que microcontrolador você está usando? Faz tempo que eu não vejo uma versão do C que trabalha com um int de 2 bytes (16 bits).
O tal microcontrolador é “big-endian” ou “little-endian”?

Big-Endian - por exemplo, o inteiro “0xCAFE” é representado pelos bytes: 0xCA, 0xFE

Little-Endian - o inteiro “0xCAFE” é representado por “0xFE”, “0xCA” (note a ordem invertida)

Desculpa, mas não sei lhe informar isso, pois, quem enviar essa informação via socket é um sistema legado que esta dentro dos dispositivos GPS, acho, assim, que por isso ele se utiliza de 16 bits, pois trabalhar com condições de processamento limitadas.
Também, não tem como alterar esses dados para trabalhar com mais processamento nem mais memória.

Interessante. Então deve ser um microcontrolador mesmo.

Bom, quanto à string:

Digamos que você tenha um array de bytes com o seguinte conteúdo, que seja uma string terminada por 0 binário:

byte[] bytes = new byte[100];
bytes[0] = 0x47;
bytes[1] = 0x55;
bytes[2] = 0x4A;
bytes[3] = 0x00;

a) Determine o comprimento da string (ou seja, a posição do primeiro byte 0)
b) Use o seguinte construtor de String:
new String()
Passe o nome do charset como “ASCII” se só houver caracteres de 0x00 até 0x7F.

Uma das minhas grandes frustrações com o Java é o fato das classes Buffer (do Java NIO) e dos Streams não terem métodos para se trabalhar com Unsigned. No Buffer até incluíram endianess, numa prova incontestável de que admitiram existir programas fora da VM, mas nada sobre unsigned.

O fato de um byte ser “signed” mas um char ser um “short unsigned” é algo insondável no Java. Nunca entendi isso. Acho que eles queriam ser compatíveis com um “smallint” de alguns bancos (que é basicamente um “signed char” do C).

Galera,

Consegui solucionar a minha duvida, da seguinte forma.
O tipo primitivo char em Java ele pode assumir letras [a-z ? A-Z] como também numero [0 - 9] isso em caractere, porém, pode receber valores de [0 - 256].
Ex:

int i = 254;
char c = (char)i;
System.out.println("Char : " + c + " Int : " + i );

Mais não para ai, ele também, pode receber dados utilizados em outras linguagem com mais facilidade. Como na linguagem C, se cria um enum simples utilizando os valores 0x01, 0x02, 0x40 … etc. Que também pode ser incorporado ao char e depois passado para int, ou para uma entidade desejável a critério do desenvolvedor.
Ex:

char c =  0x40;
int i = (int)c;
System.out.println("Char : " + c + "Int : " + i);

Assim, solucionei as minhas duvidas, espero se alguém passar por isso algum dia ajude. Até [size=18][color=blue]+[/color][/size] :lol: