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?
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
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!