Problemas com função de cálculo

6 respostas
D

Pessoal tenho o seguinte problema, preciso fazer uma função que execute o seguinte cálculo:

Se tenho os seguintes valores em hexa: 02 e 01

Tenho para isto esta função que deve estar incorreta

//Aqui faz o Cálculo do BCC
String fFrame_ = (cabecalho + cont2 + digitar_string + fim_c);
System.out.println(fFrame_);
	   	    
int bByte = 0;
for ( int i = 2 ; i < fFrame_.length() ; i++ ) {
      bByte =  (bByte^fFrame_.charAt(i))%256;
      bByte =  ((bByte << 1)*2);
}

Sendo que no fFrame esta String está em hexadecimal. Agradeço se alguém puder me ajudar a montar esta função para que o cálculo seja executado corretamente.

6 Respostas

T

Primeira coisa - strings não são arrays de bytes
Segunda coisa - converta a string hexadecimal para um array de bytes, e só então você pode usar aquela rotina que você nos mostrou. Para converter a string hexadecimal, pegue de dois em dois dígitos hexadecimais (acho que você sabe usar String.substring(), não?)
Dica - use Integer.parseInt com dois argumentos, sendo o segundo argumento a base (16). Por exemplo:

byte b = (byte) Integer.parseInt("FF", 16);

põe o valor (byte)0xFF (ou seja, -127) no byte b.

T

Em vez de usar %256, use & 0xFF
Funciona melhor (não usa uma divisão inteira, que é um processo lento - chega a ser mais lento que uma divisão de ponto flutuante em alguns processadores) - e funciona direito quando o número é negativo.

D

Valeu a ajuda thingol, mas poderia me dar uma ajuda em montar esta função, pois fiquei meio perdido na sua explicação. Abraço! :oops:

T

Desculpe o atraso…
Mas é que tenho de trabalhar :wink:

É assim: suponha que você tenha a seguinte string:

String hexa = "CAFEBABE17DEADBEEF";

Como você vê, essa string contém 34 caracteres hexadecimais, o que equivale a 17 bytes (CA, FE, BA, BE etc.)

Então você vai trabalhar não com a string original, mas com um array de bytes:

int nBytes = hexa.length / 2; byte[] bytes = new byte [nBytes];

Ok, mas feito isso, você tem um array de bytes preenchidos com o valor 0. Portanto vamos converter a string acima para o array de bytes:

for (int i = 0; i < nBytes; ++i) { bytes[i] = Integer.parseInt (hexa.substring(i*2, i*2+2), 16); }

Agora no array bytes[] você tem os bytes já convertidos direitinho. Mais moleza que isso só mandando o programa pronto pro seu email… (Obviamente dê uma conferida, estou escrevendo o código acima “de cabeça”, sem testar…)

D

Valeu pela força thingol, mas gostaria de ver contigo se estou no caminho certo, acontece que fiz algumas alterações conforme me indicastes.

int bByte = 0;
int nBytes = fFrame_.length() / 2; 
byte[] bytes = new byte [nBytes];
System.out.println("bytes:" + bytes);
for (int i = 0; i < nBytes; ++i) { 
     bytes[i] = (byte) Integer.parseInt (fFrame_.substring(i*2, i*2+2), 16);
     bytes[i] = (byte) (bByte^bytes[i]);
     bytes[i] = (byte) ((bytes[i]<<1));
	            
     System.out.println("bytes[i]:" + bytes[i]);
     bByte = bytes[i];
}
System.out.println("bByte:" + bByte);

Fiz um teste e para o exemplo da string "Fogo no setor 4 " para a qual eu tenho como resultado A6 h no cálculo:

Com o código acima me foram retornados os seguintes resultados:

Agradeço se tiveres alguma dica. Abraço!

cezarborges

o Resultado não seria por acaso 1A6 h? pois pelos meus caldulos D3 * 2 = 1A6

vc pode postar por gentileza suastring em hex

Criado 7 de outubro de 2004
Ultima resposta 6 de mar. de 2008
Respostas 6
Participantes 3