Ola mais uma vez. Procurei sobre Float32 aqui no forum e nao encontrei nada… Eu tenho que transformar um numero dado pelo usuario (String -> Float32), converter para binario, dividir de 8 em 8 e tranformar cada grupo de 8 bits em hexa
De momento estou usando o seguinte codigo
Float fl = new Float(vOholdoff.getText()) ;
@SuppressWarnings("static-access")
String outt = fl.toString(16);
System.out.println(outt);
tedArea.append(BinStringToHex(outt.substring(0, 8))); //Printing in hex the frist 8 bits
tedArea.append(BinStringToHex(outt.substring(8, 16))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(16, 24))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(24, 32))); //Printing in hex next 8 Bits
Nao eh eficiente mas funciona. O problema que eh uma float comum, sendo assim ele da erro na hora que procura os ultimos bits
Na minha cabeca (que esta errada claro), era so usar Float32 no lugar do Float… Mass… Nao funciona
Esses são os tipos de dados disponíveis em ponto flutuante
E tem a classe BigDecimal… para números gigantescos…
M
Mateus_Furlan
rogelgarcia:
Em Java o tipo de dados float… tem 32 bits
E o double tem 64 bits…
Esses são os tipos de dados disponíveis em ponto flutuante
E tem a classe BigDecimal… para números gigantescos…
Mas entao na teoria era para funcinar
Porem ele imprime 30 bits quando eu uso virgula, teria que ser 32 certo?
100000010100000000000000000000
Por isso ele nao consegue formar o ultimo hexa
Na verdade do codigo correto eh este
Float bi = new Float(vOholdoff.getText()) ;
@SuppressWarnings("static-access")
String outt = Integer.toBinaryString(Float.floatToRawIntBits(bi));
//String outt = bi.toString(16);
System.out.println(outt);
tedArea.append(BinStringToHex(outt.substring(0, 8))); //Printing in hex the frist 8 bits
tedArea.append(BinStringToHex(outt.substring(8, 16))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(16, 24))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(24, 31))); //Printing in hex next 8 Bits
ELe imprime
111111000000000000000000000000
111111000001011111001010001000
111111000001011111001010001110
Somente 30?
rogelgarcia
Talvez… os dois primeiros bits são 00?? E por isso nao tá imprimindo??
M
Mateus_Furlan
Isso… acredito que seja isso, bem pensado… Ateh pq calculando vi que ele esta retornando o numero errado em hexa
Entao sabes como fazer ele mostrar todos os 32 bits? Pois nesse caso (em todo binario acredito) sao mt importantes tais zeros a esquerda…
IEEE 754 (Padrão usado para pontos flutuantes em Java)
M
Mateus_Furlan
Como sera sempre um numero positivo… resolvi do modo bruto… colei os dois 00 na frente do bin
tedArea.append("0a 04 ");
Float bi = new Float(vOholdoff.getText()) ;
@SuppressWarnings("static-access")
String outt = Integer.toBinaryString(Float.floatToRawIntBits(bi));
//String outt = bi.toString(16);
System.out.println(outt);
tedArea.append(BinStringToHex("00" + outt.substring(0, 6))); //Printing in hex the frist 8 bits
tedArea.append(BinStringToHex(outt.substring(6, 14))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(14, 22))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(22, 30))); //Printing in hex next 8 Bits
tedArea.append("\n");
Obrigado a todos mais uma vez
rogelgarcia
isso tedArea.append(BinStringToHex(“00” + outt.substring(0, 6))); //Printing in hex the frist 8 bits tedArea.append(BinStringToHex(outt.substring(6, 14))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(14, 22))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(22, 30))); //Printing in hex next 8 Bits
nao seria tedArea.append(BinStringToHex(outt.substring(0, 8 ))); //Printing in hex the frist 8 bits tedArea.append(BinStringToHex(outt.substring(8, 16))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(16, 24))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(24, 32))); //Printing in hex next 8 Bits
IEEE 754 (Padrão usado para pontos flutuantes em Java)
Obrigado… Usei a 754 para resolver o problema… No meu caso vai funcinar… Mas dependendo o caso (se for um numero negtivo por exemplo) teri q mudar o codigo…
M
Mateus_Furlan
rogelgarcia:
isso tedArea.append(BinStringToHex(“00” + outt.substring(0, 6))); //Printing in hex the frist 8 bits tedArea.append(BinStringToHex(outt.substring(6, 14))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(14, 22))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(22, 30))); //Printing in hex next 8 Bits
nao seria tedArea.append(BinStringToHex(outt.substring(0, 8 ))); //Printing in hex the frist 8 bits tedArea.append(BinStringToHex(outt.substring(8, 16))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(16, 24))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(24, 32))); //Printing in hex next 8 Bits
?
Nao nesse caso, como ele so estava imprimindo 30 bits (excluia os 2 primeiros) eu recoloquei os dois zeros na frente nesta linha tedArea.append(BinStringToHex(“00” + outt.substring(0, 6))); //Printing in hex the frist 8 bits
Sendo assim ele nao vai ter que pegar os 8 primeiros bits… somente o 00 (que inclui manualmente) e os 6 primeiros… finalizando 8 bits
dai em diante ele vai pegando os outros de 8 em 8
6 + 8 = 14 (pega bit 6 ateh o 14)
e assim por diante… fechando os 30 bits + 2 bits que botei no inicio… = 32