Autore Topic: Byte array maggiore di 255  (Letto 349 volte)

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Byte array maggiore di 255
« il: 01 Settembre 2014, 11:13:46 CEST »
0
Salve a tutti, la mia applicazione riceve un byte da uno strumento bluetooth che invia 8-bit. Per vari motivi ora lo strumento invia 16-bit (ovvero 2 byte per volta) e non riesco a gestire il tutto. In pratica se parto da valori che vanno da 0 a 255 è tutto perfetto come prima mentre il valore successivo, per esempio 256, me lo codifica come 0 e poi tutti gli altri a salire. So che con byte posso ottenere solo 8-bit e quindi non riesco ad andare oltre a 255 ma ho provato a cambiarlo con short ma ottengo un errore.

Codice (Java): [Seleziona]
byte[] readBuf = (byte[]) msg.obj;
String strIncom = new String(readBuf);          
char c = strIncom.charAt(0)

Questa parte funziona fino a 255.

Qualcuno ha qualche idea da darmi?


P.S. se sostituisco con short ottengo questo errore nel logcat
Codice: [Seleziona]
byte[] cannot be cast to short[]

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Byte array maggiore di 255
« Risposta #1 il: 01 Settembre 2014, 11:38:46 CEST »
+1
Puoi ricombinare i due byte a posteriori, facendo ad esempio:

Codice (Java): [Seleziona]
short valore_a_16 = readbuf[0] + 256*readbuf[1];
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Byte array maggiore di 255
« Risposta #2 il: 01 Settembre 2014, 12:26:07 CEST »
0
Ti ringrazio in questo modo funziona parzialmente. Ottengo i due byte ma mi rimane un problema.
I valori ottenuti devo inserirli in un grafico ma prima devo effettuare un calcolo per il valore ottenuto:

Codice (Java): [Seleziona]
short valore_a_16 = (short) (readBuf[0] + 256*readBuf[1]);
String str = String.valueOf(valore_a_16);
int foo = Integer.parseInt(str);
String valore = Integer.toString(foo);
Log.d("Valore", valore);           // Fino a qui il valore è giusto
long risultato = (long) (foo * 5000000)/(65535*150);  //Qui non so per quale motivo ma ottengo valori negativi anche se è tutto positivo
String prova = Float.toString(risultato);
 Log.d("prova", prova);

Non so per quale motivo ma ottengo dei valori negativi. Hai idea di quale possa essere il problema?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Byte array maggiore di 255
« Risposta #3 il: 01 Settembre 2014, 12:30:14 CEST »
0
Per risponderti con precisione sul "perchè", dovrei fare qualche verifica con il codice, ma ipotizzo un overflow dei numeri prima della promozione a long. Per ora prova ad usare un valore_a_16 long.

Codice (Java): [Seleziona]
long valore_a_16 = (long) (readBuf[0] + 256*readBuf[1]);
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Byte array maggiore di 255
« Risposta #4 il: 01 Settembre 2014, 12:41:04 CEST »
0
Ho provato anche così ma continua ad oscillare tra valori positivi e valori negativi.
E' strano però che prima di fare questo calcolo i valori sono giusti:

Codice: [Seleziona]
long risultato = (long) (foo * 5000000)/(65535*150);

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Byte array maggiore di 255
« Risposta #5 il: 01 Settembre 2014, 13:49:49 CEST »
+1
Ho provato anche così ma continua ad oscillare tra valori positivi e valori negativi.

Ok, ci potrebbe essere questo altro problema: in Java non esistono i numeri unsigned, anche i byte sono signed, per cui se anche la rappresentazione binaria del byte è senza segno, java te lo mostra con il segno. Per intendersi: 0x01=1 mentre 0xFF=-1 e non 255.

Attenzione però, l'informazione corretta ce l'hai tutta, perchè tu ricevi 0xFF.

Per verificare se è effettivamente il tuo caso, prova a fare un Log.d() dei byte separatamente e del valore a 16 bit ricavato.

Se è questo il caso, si può risolvere scrivendo così il valore a 16:

Codice (Java): [Seleziona]
int valore_a_16 = ((readBuf[1] & 0xFF) << 8) | (readBuf[0] & 0xFF);
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Byte array maggiore di 255
« Risposta #6 il: 01 Settembre 2014, 14:11:55 CEST »
0
Ogni tanto mi commuovono quando leggo delle spiegazioni cosi precise

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Byte array maggiore di 255
« Risposta #7 il: 01 Settembre 2014, 14:18:23 CEST »
0
Secondo me è quello il problema ma non nel readBuf, è nel risultato. Perchè è da lì in poi che i valori diventano negativi. Come si può fare per scoprirlo?

Post unito: 02 Settembre 2014, 09:52:01 CEST
Ho risolto! ho sostituito il valore "foo" da int a long. Penso che fosse questo a mandarlo in overflow! Grazie per tutti i consigli!
« Ultima modifica: 02 Settembre 2014, 09:52:01 CEST da davix10, Reason: Merged DoublePost »