conversion de tipos.

Iniciado por kondrag_X1, 5 Agosto 2015, 21:12 PM

0 Miembros y 1 Visitante están viendo este tema.

kondrag_X1

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 (java) [Seleccionar]

byte[] scandRecord ={9,9,65,114,113,117,101,116,97,0,3,3,-1,-1,5,-1,15,60,112
,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,
0,0,0,0,0,0,0,0,0,0,0,0,0};


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.


ivancea96

Pero ese código no es lo que te llega, eso es una variable a la que tú le has asignado unos valores ._.

kondrag_X1

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 (java) [Seleccionar]

public static List<AdRecord> parseScanRecord(byte[] scanRecord) {
        List<AdRecord> records = new ArrayList<AdRecord>();

        int index = 0;
        while (index < scanRecord.length) {
            int length = scanRecord[index++];
            //Done once we run out of records
            if (length == 0) break;

            int type = scanRecord[index];
            //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;
    }

por si el código le sirve a alguien.
A alguien se le ocurre como?

ivancea96

Teniend en cuenta que byte es signed, lo que puedes hacer para comparar, es pasarlo a int.
Puedes pasarlo a int con:
Código (java) [Seleccionar]
int n = b&0xff;

kondrag_X1

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?


ivancea96

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.

kondrag_X1

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;
    }