Duvida Java

3 respostas
D

Pessoal eu tenho o seguinte comando em C que preciso converter para Java:

cks=(((~v_check_sum)+1)|0x80)&0x00ff;

Onde ~v_check_sum serve para inverter os valores,
b+1 [/b] soma 1 ao valor,
0x80 Seta o Bit 7 para não ser menor que 32
&0x00ff Zera a parte alta para não passar de 255 (Byte)

Agradeço se alguém puder me ajudar.

3 Respostas

T

O que é que você precisa converter?
Os operadores de bits são iguaizinhos em C e em Java e funcionam do mesmo jeito.
O Java tem apenas um operador a mais, que é o “>>>” e serve para contornar o fato que não existe tipo “unsigned” em Java (exceto o “char”, que funciona mais ou menos como se fosse um “unsigned short” em plataformas onde o “short” tem 16 bits). Mas o resto funciona igualzinho.
Tou achando que você está se enrolando com tipos de variáveis, não com operadores. Passe as declarações das variáveis aqui que são elas que precisam ser revisadas.

D

thingol eu tenho a seguinte string que tenho de enviar para um painel digital

Acima tenho o “027” como “INI” e respectivamente os outros valores em string e em decimal.

v_check_sum=034+033+033+033+032+066+079+049+032+032+032+032+057+057+044+057+057+032+032;

O valor do chk quando calculado para esta string deve dar 177

Como podes observar o meu v_check_sum precisa somar todos os valores da string menos o “027”. Meu cks será obtido a partir do cálculo da função que lhe passei: cks=(((~v_check_sum)+1)|0x80)&0x00ff;
Abaixo segue o programa onde tento enviar dados para o painel, sendo que preciso montar o cálculo do chk e meu problema é que estou convertendo os valores de string para hexa e para fazer a soma no v_check_sum eu preciso transformar os valores em inteiros. Agradeço se puder me ajudar.

import Painel_JDJ.*;

public class Stest5 extends SerialCom {
       public Stest5(){
              super();
       }
       public static void main(String[] args){
           String frame_="";
           String meio_string;
           int linha1int, v_check_sum, hexa_stringint, cabecalhoint;
            
           StringBuffer inicio_string = new StringBuffer("1B"); 
		   String inicio_stringHexToString = new String("");
			
			for(int i = 0; i < inicio_string.length(); i += 2){
			    String inicio_stringTemp = inicio_string.substring(i, i + 2);             
			    inicio_stringHexToString += new Character((char)(Integer.valueOf(inicio_stringTemp,16).intValue())).toString();
			    frame_=inicio_stringHexToString;
			}
			System.out.println("Inicio:" + inicio_string);
			
		    
		   StringBuffer cabecalho = new StringBuffer("2221212120FE22"); 
		   String cabecalhoHexToString = new String("");
           
           for(int i = 0; i < cabecalho.length(); i += 2){
               String cabecalhoTemp = cabecalho.substring(i, i + 2);             
               cabecalhoHexToString += new Character((char)(Integer.valueOf(cabecalhoTemp,16).intValue())).toString();
               frame_=cabecalhoHexToString;
           }
           
           System.out.println(cabecalho);
           
           meio_string = JOptionPane.showInputDialog( "Digite a String" );
           System.out.println(meio_string);
           
           
           StringBuffer hexa_buf = new StringBuffer(); 
           for (int i = 0; i < meio_string.length(); i++) { 
               char ch = meio_string.charAt(i); 
               if (ch < 0x10) 
                   hexa_buf.append('0');  // addiciona zero para numeros com só uma casa 
               hexa_buf.append(Integer.toHexString(ch & 0xFF)); 
           } 
           String hexa_string = hexa_buf.toString(); // aqui só o codigo hexadecimal 
                      
           System.out.println(hexa_string);
                      
           StringBuffer linha1 = new StringBuffer("04"); 
		   String linha1HexToString = new String("");
           
           for(int i = 0; i < linha1.length(); i += 2){
               String linha1Temp = linha1.substring(i, i + 2);             
               linha1HexToString += new Character((char)(Integer.valueOf(linha1Temp,16).intValue())).toString();
               frame_=linha1HexToString;
           }
           
           System.out.println(linha1);
           
           
           
           //v_check_sum=(cabecalho +  meio_string1);
           //System.out.println(v_check_sum);
           
           
           
                      String concatenaHexToString= (inicio_stringHexToString + cabecalhoHexToString + meio_string + linha1HexToString );
           
           Stest5 st = new Stest5();
           
                if ( st.PortaExiste("COM1") == true) {
                   System.out.println("Iniciando comunicação!");
                   SComm sc = new SComm("COM1",19200,1);
                   sc.HabilitarEscrita();
                   sc.ObterIdDaPorta();
                   sc.AbrirPorta();
                   sc.EnviarUmaString(concatenaHexToString);                   
                   System.out.println(concatenaHexToString);
                   sc.FecharCom();
                   Stest5 st2 = new Stest5();

                   if ( st2.PortaExiste("COM1") == true) {
                       System.out.println("Iniciando comunicação!");
                       SComm sc2 = new SComm("COM1",19200,1);
                       sc2.HabilitarLeitura();
                       sc2.ObterIdDaPorta();
                       sc2.AbrirPorta();
                       sc2.LerDados();
                       sc2.FecharCom();
                    }
                }  else {
                   System.out.println("Nenhuma porta");
                }
       }
}
T

Ah, agora entendi…

(Mais ou menos, que eu sou péssimo para ler fontes que os outros escreveram. Ainda mais quando uma função tem mais de 30 linhas :roll: )

Basta declarar v_check_sum como int, inicializar com zero, e somar os valores que devem ser somados (não entendi no seu programa onde é que você soma os valores, se é que você está somando). Depois você aplica aquela fórmula daquele jeito mesmo e veja se dá o resultado esperado.

Criado 10 de setembro de 2004
Ultima resposta 10 de set. de 2004
Respostas 3
Participantes 2