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)
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.
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");
}
}
}
(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.