Foro de elhacker.net

Programación => Java => Mensaje iniciado por: kondrag_X1 en 5 Agosto 2015, 21:12 pm



Título: conversion de tipos.
Publicado por: kondrag_X1 en 5 Agosto 2015, 21:12 pm
Hola tengo una dudilla a ver si me pueden echar una mano.

tengo un array de bytes que me llega de un dispositivo Bluetooth
Código
  1. byte[] scandRecord ={9,9,65,114,113,117,101,116,97,0,3,3,-1,-1,5,-1,15,60,112
  2. ,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  3. 0,0,0,0,0,0,0,0,0,0,0,0,0};
  4.  

yo se que la información que me tiene que llegar va a ser unsigned y de 8 bites por eso no entiendo porque aparece el -1, debería aparecer f = 255 2^7-1 que es lo que ha sido enviado en el dispositivo.

Como podría yo comparar estos valores si estoy haciendo una comparación en hex.
es decir 0xf con -1.

hasta ahora comparaba cogiendo el tipo?

switch(byte)
     case 0xff:

pero no me funciona?

PD: creo que son las horas delante de la pantalla las que demuestran mi idiotez.



Título: Re: conversion de tipos.
Publicado por: ivancea96 en 5 Agosto 2015, 22:16 pm
Pero ese código no es lo que te llega, eso es una variable a la que tú le has asignado unos valores ._.


Título: Re: conversion de tipos.
Publicado por: kondrag_X1 en 5 Agosto 2015, 22:31 pm
si, los valores que le he asignado a la variable son lo que me llegan y los valores estan formando un paquete como explica aquí:

http://j2abro.blogspot.com.es/2014/06/understanding-bluetooth-advertising.html

yo separo los campos del byte array que hay arriba y hay 3 paquetes pero no se como puedo comparar el tipo.

obtener los paquetes del payload advertisement
Código
  1. public static List<AdRecord> parseScanRecord(byte[] scanRecord) {
  2.        List<AdRecord> records = new ArrayList<AdRecord>();
  3.  
  4.        int index = 0;
  5.        while (index < scanRecord.length) {
  6.            int length = scanRecord[index++];
  7.            //Done once we run out of records
  8.            if (length == 0) break;
  9.  
  10.            int type = scanRecord[index];
  11.            //Done if our record isn't a valid type
  12.            if (type == 0) break;
  13.  
  14.  
  15.            byte[] data = Arrays.copyOfRange(scanRecord, index + 1, index + length);
  16.  
  17.            records.add(new AdRecord(length, type, data));
  18.            //Advance
  19.            index += length;
  20.        }
  21.  
  22.        return records;
  23.    }
  24.  
por si el código le sirve a alguien.
A alguien se le ocurre como?


Título: Re: conversion de tipos.
Publicado por: ivancea96 en 5 Agosto 2015, 23:41 pm
Teniend en cuenta que byte es signed (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html), lo que puedes hacer para comparar, es pasarlo a int.
Puedes pasarlo a int con:
Código
  1. int n = b&0xff;


Título: Re: conversion de tipos.
Publicado por: kondrag_X1 en 6 Agosto 2015, 00:42 am
a pués no había caído que byte de java es con signo. haciendo eso que me comentas tendría que dar 255, verdad?

mi duda ahora es, s recibo datos unsigned cuando mire otra vez el array de bytes puedo encontrarme numero negativos o sólo aparecerá el -1?



Título: Re: conversion de tipos.
Publicado por: ivancea96 en 6 Agosto 2015, 13:35 pm
Habrá otros números. Todo depende del tipo de datos binarios que estés tratando.

Con "& 0xff", convertimos el byte a int, y le aplicamos esa máscara, que solo nos dejará los últimos 8 bites (lo que buscamos). Además como es int, que tiene unos 32 bites, no será negativo, pues el bit de signo es el primero empezando desde la izquierda.

Simplemente asegúrate de aplicarle la máscara a cada byte antes de tratarlo. Y ten en cuenta, que tras aplicale la máscara, se convertirá en int.


Título: Re: conversion de tipos.
Publicado por: kondrag_X1 en 7 Agosto 2015, 16:21 pm
Código:
tenias toda la razón del mundo y muchísimas gracias el problema venia que no hacia bien la conversión cuando guardaba el tipo de paquete por eso no me lo reconocía haciendo eso que explicas se soluciona el problema.
[/code=java]
public static List<AdRecord> parseScanRecord(byte[] scanRecord) {
        List<AdRecord> records = new ArrayList<AdRecord>();
 
        int index = 0;
        while (index < scanRecord.length) {
            int length = scanRecord[index++] & 0xFF;
            //Done once we run out of records
            if (length == 0) break;
 
            int type = scanRecord[index] & 0xFF;
            //Done if our record isn't a valid type
            if (type == 0) break;
 
 
            byte[] data = Arrays.copyOfRange(scanRecord, index + 1, index + length);
 
            records.add(new AdRecord(length, type, data));
            //Advance
            index += length;
        }
 
        return records;
    }