Array de bytes em Inteiro

Tenho um array de byte de 4 posicoes e preciso transforma-lo em um inteiro, existe algum metodo ou classe que me auxilie?

byte numero[4] = {22, 56, 0, 0};

o resultado devera ser 22050.

Alguem que conta usar para chegar neste valor?

Se cada um desses valores é um byte de um int, sendo numero[3] o mais significativo, você pode tentar isso aqui:

int valor = (numero[3] & 0xFF) << 24 | (numero[2] & 0xFF) << 16 | (numero[1] & 0xFF) | (numero[0] & 0xFF);

[quote=Renato_natos]Tenho um array de byte de 4 posicoes e preciso transforma-lo em um inteiro, existe algum metodo ou classe que me auxilie?

byte numero[4] = {22, 56, 0, 0};

o resultado devera ser 22050.

Alguem que conta usar para chegar neste valor?[/quote]

Tem coisa errada. Se fosse:

byte numero[4] = {0x22, 0x56, 0x00, 0x00};

seria fácil, porque 22050 = 0x00005622

e você pode usar as contas de manipulação de bits.

Eu sei que é feio oq eu vou falar, mas vc poderia converter cada posição para String, concatenar e depois Integer.valueOf

Não?

=D

  • Não entendo muito de hexadecimal [= *

tentei todas as solucoes mais sempre da o mesmo resultado,

Tem coisa errada. Se fosse:

byte numero[4] = {0x22, 0x56, 0x00, 0x00};

seria fácil, porque 22050 = 0x00005622

e você pode usar as contas de manipulação de bits.

Como seria esta conta?

Valeu rapaziada!

Seria a conta que eu postei.

eu fiz assim:

int valor = 0x00005622;

Deu certo, so preciso descobrir uma forma de montar o array de byte nesta estrutura.
Alguma dica?

Pensei em montar uma String e fazer assim:

byte valor[] = {22, 56, 00, 00};
String str = "0x"+valor[3]+valor[2]+valor[1]+valor[0];

e depois converter a String para o int. Existe alguma forma melhor?

O que exatamente você quer fazer?

Pq do jeito que você fez, jamais vai poder representar números como esses:
0x01BABACA
0xFADAB0BA
0x1AFACADA
0xC0CAC01A

De onde surgiu esse array de bytes? E que tipo de conversões você está fazendo?

Converter em String é um caminho um tanto desajeitado para resolver esse problema.
Acho que antes de “fazer funcionar”, é melhor você entender o que está fazendo.

Se vc tem um int assim:

int valor = 0xB0CAB0BA;

Então, a melhor maneira de transformar num array com os 4 bytes que compõe esse inteiro é:

byte bytes[] = new byte[4]; byte[3] = (byte)(valor & 0xFF); byte[2] = (byte)((valor >> 8) & 0xFF); byte[1] = (byte)((valor >> 16) & 0xFF); byte[0] = (byte)((valor >> 24) & 0xFF);

Não adianta olhar o valor de cada um dos números do array.
Vai dar uns valores positivos e outros negativos entre -127 e 128.

Mas pelo menos, seus valores irão conter o correspondente correto em hexadecimal.

O que vc está fazendo é uma aberração matemática. Você está pegando um grupo de números decimais, usando seu valor se eles fossem escritos em outra base (no caso a 16), e então tentando entender tudo como se fossem componentes de um único int.
Entenda certinho o que está fazendo, ou acabará com sérios problemas.

Ok vinigodoy. Como ja pedi ajuda antes, estou precisando pegar informacoes do cabecalho de arquivos e depois de algumas pesquisas percebi que a melhor solucao seria pegar os bytes correspondentes a estas informacoes. E este array de bytes que passei eh referente a uma das informacoes do cabecalho que preciso.
A unica informacao que tenho eh que estes quatro bytes sao um unico numero inteiro.

Fiz assim:

int valor = 0x00005622;
System.out.println(valor);

e o resultado foi o esperado.

Agora a unica duvida eh como montar o valor 0x00005622 a partir do array de bytes e converte-los para int.

Da forma que vc me disse para fazer o resultado fica diferente. Vc pode me dar alguma ajuda?

E como vc está lendo seu arquivo?

Se for com um DataInputStream, basta fazer um readInt.
Ele lerá 4 bytes e montará um número inteiro para você.

Opa, consegui. Fiz o seguinte:

int valor = Integer.parseInt("00005622",16);

Nao sei se eh a melhor forma, estou aberto a sugestoes.

obs.: ViniGodoy, muito obrigado pela paciencia e dedicacao em me ajudar!

Pois é, mas jogar as coisas para String é um jeito extremamente ineficiente.
Um arquivo ligeiramente mais longo e você terá problemas.

Volto a perguntar: Você está usando o DataInputStream?

Nao, estou usando InputStream e leio os primeiros 44 bytes, meu arquivo eh um wave.

Aliás, se você está lendo aquele arquivo que passou a especificação no outro tópico, ele mistura informações em little endian e big endian. E também trabalha com dados em formato unsigned (que, por sinal, não é suportado em Java).

Se for esse o caso, dê uma estudada em como funciona a classe FileChannel e ByteBuffer. Elas te darão métodos que fazem a leitura de n bytes do arquivo automaticamente e tratam a questão do endianess.
Também dê uma olhada nesse classe aqui, que postei no fórum: http://www.guj.com.br/posts/list/48335.java#253015

Pois ela trata o caso dos unsigned, e de leituras de Strings.

Por isso você está se complicando. Leia o cabeçalho aos poucos, usando os métodos do DataInputStream (ou, melhor ainda, do ByteBuffer), e tudo vai ficar beeem mais fácil.

Blz, ViniGodoy, valeu. Vou continuar as pesquisas por aqui, quando terminar irei postar a forma que usei.

Novamente muito obrigado!