Estou tendo um problema na hora de converter uma string hexadecimal para decimal, ocorre o seguinte quando tento converter o valor hexadecimal 49 para decimal, a função me retorna o valor correto 73 , mas quando tento converter minha string 49505152 a função me retorna [telefone removido] , gostaria de ver se alguém poderia me ajudar na solução deste problema, pois o valor que a função deveria me retornar seria 73808182. Agradeço se alguém tiver uma idéia. Estou utilizando a seguinte função:
publicclassteste{publicteste(){Stringin="424f312020202039392c3939";Stringout="";doubledecimal=0;// expoente da baseintexp=0;System.err.print(Integer.parseInt("F",16));StringBufferhexa_buf=newStringBuffer(in);for(inti=0;i<in.length();i++){Stringtmp=""+hexa_buf.charAt(i);decimal+=Integer.parseInt(tmp,16)*Math.pow(16,i);}System.err.print("\n\n");System.err.print(decimal);}publicstaticvoidmain(String[]args){newteste();}}
testado e funcionando
[]'s
Erko Bridee
R
riqueneilPJ
[color=“darkblue”]Olá!
Cara, oq acontece é o seguinte, os inteiros tem um limite baixo…
ao invés de converter para inteiro converta para Long[/color]
[color=“darkblue”]Alguém por favor me corrigar se eu fiz o cash errado, me deu uma dúvida agora :P…
[]'s[/color]
D
DouglasCarPJ
Valew pela dica AnjoSupremo, mas acontece que ao testar o seu programa, pensei que o mesmo me retornaria a string “667931323232325757445757”, sendo que me foi retornado o valor
“4.567292740058316E28”. Desculpe minha ignorância, mas não entendi este resultado. Agradeço se puder me explicar.
D
DouglasCarPJ
Valeu riqueneil pela sua ajuda, mas cara tentei utilizar o seu código no programa e acontece o seguinte, se eu não utilizar o “,16” na função como no exemplo que te enviei "int digitar1 = Integer.parseInt(digitar,16); ", tanto faz se utilizar int ou long, vai funcionar, mas não consigo transformar para decimal. Agradeço se tiveres outra dica. Para testar sua função utilizei o seguinte código, e funcionou da mesma maneira que quando utilizei o int:
Valeu riqueneil pela sua ajuda, mas cara tentei utilizar o seu código no programa e acontece o seguinte, se eu não utilizar o “,16” na função como no exemplo que te enviei "int digitar1 = Integer.parseInt(digitar,16); ", tanto faz se utilizar int ou long, vai funcionar, mas não consigo transformar para decimal. Agradeço se tiveres outra dica. Para testar sua função utilizei o seguinte código, e funcionou da mesma maneira que quando utilizei o int:
String digitar = ("49505152");
String digitarHexToString = new String("");
for(int i = 0; i < digitar.length(); i += 2){
String digitarTemp = digitar.substring(i, i + 2);
digitarHexToString += new Character((char)(Integer.valueOf(digitarTemp,16).intValue())).toString();
frame_=digitarHexToString;
}
System.out.println("digitar:" + digitarHexToString);
long digitar1 = Long.parseLong (digitarHexToString);
System.out.println("digitar1:" + digitar1);
naum entendi oq tu quiz dizer :roll:
R
riqueneilPJ
[color=“darkblue”]Opa!
Sabe oq q é… vc sabe q os inteiros tem um limite, eles só vão à valores por vota de 32000 com sinal e sem vão à uns 65000, entendeu?
Ele estava passando esses valores e então dei a dica para que ele usasse long ao invés de inteiros…
São valores que conseguem atingir um limite maior…
[]'s[/color]
D
DouglasCarPJ
Pessoal, como pude perceber ao tentar converter a string “49505152” o valor retornado foi “[telefone removido]”, ou seja converteu a string como um todo, gostaria de ver com vocês se alguém sabe como eu poderia fazer para converter a string pegando somente os valores em pares, tipo uma função que me retornasse como resultado da conversão a string “73808182”, ou seja me retornasse os valores em decimal de “49”, “50”, “51” e “52” na mesma string. Agradeço se alguém tiver uma sugestão.
D
DouglasCarPJ
Desculpem eu repeti a mensagem anterior.
R
riqueneilPJ
[color=“darkblue”]Cara, eu reparei que no meio do código vc ainda usa inteiro para os caracteres!!
Pelo menos foi isso q eu entendi!!
Agora acredito que tenha um modo mais fácil de fazer isso…
Vou tentar bolar algo aki se tiver tempo… ok??
[]'s[/color]
D
DouglasCarPJ
Valeu pessoal pela ajuda, graças ao riqueneil e ao AnjoSupremo consegui converter a minha string de hexa para decimal. Ocorre que preciso fazer um cálculo para o cks que é o checksum do painel e para isso eu preciso converter os valores para inteiro e somar cada um deles. Segue abaixo o código que estou utilizando, com dois comentários, onde coloco o problema que preciso resolver no programa:
importjava.math.BigInteger;importPainel_JDJ.*;importjavax.swing.JOptionPane;importjavax.swing.JTextField;publicclassStest5extendsSerialCom{publicStest5(){super();}publicstaticvoidmain(String[]args){Stringframe_="";Stringdigitar;Stringinicio=("1B");StringinicioHexToString=newString("");for(inti=0;i<inicio.length();i+=2){StringinicioTemp=inicio.substring(i,i+2);inicioHexToString+=(Integer.parseInt(inicioTemp,16));frame_=inicioHexToString;}System.out.println(inicioHexToString);Stringcontinuacao=("2221212120FE");StringcontinuacaoHexToString=newString("");for(inti=0;i<continuacao.length();i+=2){StringcontinuacaoTemp=continuacao.substring(i,i+2);continuacaoHexToString+=(Integer.parseInt(continuacaoTemp,16));frame_=continuacaoHexToString;}System.out.println("continuacao:"+continuacaoHexToString);System.out.println("continuacao1:"+continuacao);digitar=JOptionPane.showInputDialog("Digite a String");System.out.println("meio:"+digitar);StringBufferdigitar1=newStringBuffer();for(inti=0;i<digitar.length();i++){charch=digitar.charAt(i);if(ch<0x10)digitar1.append('0');// addiciona zero para numeros com só uma casa digitar1.append(Integer.toHexString(ch&0xFF));}Stringdigitar_string=digitar1.toString();// aqui só o codigo hexadecimalStringdigitar_stringHexToString=newString("");for(inti=0;i<digitar_string.length();i+=2){Stringdigitar_stringTemp=digitar_string.substring(i,i+2);digitar_stringHexToString+=(Integer.parseInt(digitar_stringTemp,16));frame_=digitar_stringHexToString;}System.out.println("digitar:"+digitar_stringHexToString);Stringfim=("04");StringfimHexToString=newString("");for(inti=0;i<fim.length();i+=2){StringfimTemp=fim.substring(i,i+2);fimHexToString+=(Integer.parseInt(fimTemp,16));frame_=fimHexToString;}System.out.println("fim:"+fimHexToString);/*Aqui deveria ser somado cada elemento das strings "continuacao HexToString" com cada elemento da "digitar_stringHexToString", sendo que para fazer a soma eu teria de transformar cada par de números da string em um valor inteiro resultando em um "v_check_sum" com valor inteiro também */BigIntegerv_check_sum=newBigInteger(continuacaoHexToString+digitar_stringHexToString);System.out.println(v_check_sum);/*Aqui sera usado depois de calculado o"v_check_sum" para então calcular o cks unsigned char cks=0; unsigned int v_check_sum=0; cks=(((~v_check_sum)+1)|0x80)&0x00ff; */Stest5st=newStest5();if(st.PortaExiste("COM1")==true){System.out.println("Iniciando comunicação!");SCommsc=newSComm("COM1",19200,1);sc.HabilitarEscrita();sc.ObterIdDaPorta();sc.AbrirPorta();//sc.EnviarUmaString(concatenaHexToString); // System.out.println(concatenaHexToString);sc.FecharCom();Stest5st2=newStest5();if(st2.PortaExiste("COM1")==true){System.out.println("Iniciando comunicação!");SCommsc2=newSComm("COM1",19200,1);sc2.HabilitarLeitura();sc2.ObterIdDaPorta();sc2.AbrirPorta();sc2.LerDados();sc2.FecharCom();}}else{System.out.println("Nenhuma porta");}}}
Abaixo esta a explicação que tenho sobre o protocolo de comunicação com o painel digital que possuo.