Autore Topic: intero superiore a 128 in un ByteBuffer  (Letto 747 volte)

Offline MarkRider

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    motorola e minipc
  • Sistema operativo:
    Win 7,Win XP
intero superiore a 128 in un ByteBuffer
« il: 09 Dicembre 2013, 20:35:55 CET »
0
Salve a tutti,
Sto scrivendo un app per una connessione usb, e mi è apparso un problema che non mi aspettavo.
Quando cerco di fare unahttp://developer.android.com/reference/android/hardware/usb/UsbRequest.html#queue(java.nio.ByteBuffer, int) come si evince dalla spiegazione, accetta solo un buffer di tipo Byte.
Posso modificare tranquillamente il firmware del dispositivo con cui comunica, ma per imparare a conoscere un po meglio il Java, vorrei capire come mai se inserisco un intero castato Byte di valore 129, quando esamino il buffer, trovo un valore -127. se inserisco un valore 130 int, mi ritrovo un -126.
Ho pensato che potesse dipendere dal signed unsigned, che però non ho riscontrato esistere in java. per cui non capisco, se un byte è formato da 8 cavolo di bit che dovrebbero poter assumere un valore uguale da 0 a 255 decimale, perchè diavolo mi va in negativo?

un pezzetto di codice:

Codice: [Seleziona]
@Override
                    public void run() {
                            Log.d(TAG, "è stato avviato un'altro processo");
                            int bufferMaxLength=mEndpointIn.getMaxPacketSize();
                        ByteBuffer buffer = ByteBuffer.allocate(bufferMaxLength);
                        UsbRequest request = new UsbRequest();
                        request.initialize(mConnection, mEndpointOut);
                       
                       
                       
                        while(true)
                        {
                        if(COMMAND != STATUS)
                                {
                                       
                                buffer.clear();
                                buffer.put(0,(byte)130); // risultato è -126 O_o
                                                       
                                Log.i("Invio dati: ", String.valueOf( request.queue(buffer, 1)) + COMMAND);
                           

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:intero superiore a 128 in un ByteBuffer
« Risposta #1 il: 09 Dicembre 2013, 20:59:36 CET »
0
Ho pensato che potesse dipendere dal signed unsigned, che però non ho riscontrato esistere in java. per cui non capisco, se un byte è formato da 8 cavolo di bit che dovrebbero poter assumere un valore uguale da 0 a 255 decimale, perchè diavolo mi va in negativo?

Come hai già scoperto, in Java non esiste il concetto di unsigned.

Ma ovviamente questo non impedisce di usare i "byte". Basta abituarsi al fatto che un conto sono i bit (sequenza) e un altro la rappresentazione in numero (con segno).  Il 129 ti viene rappresentato come -127 perchè 129d = 10000001b = -127 nella rappresentazione signed byte.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MarkRider

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    motorola e minipc
  • Sistema operativo:
    Win 7,Win XP
Re:intero superiore a 128 in un ByteBuffer
« Risposta #2 il: 09 Dicembre 2013, 21:51:47 CET »
0
daccordo, ma non c'è proprio modo di avere un 129 all'interno di un Byte? mettiamo caso che il firmware non l'avessi scritto io, e che dovevo gestire una connessione dove invio un numero di informazioni comprese tra 0 e 255.

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:intero superiore a 128 in un ByteBuffer
« Risposta #3 il: 09 Dicembre 2013, 22:42:52 CET »
0
Semplice lo casti in un byte:
Codice (Java): [Seleziona]
byte b = (byte) 129; //beh ovviamente non ha senso mettere il valore, metterai il nome del tuo integer
Poi su android quel byte di fatto varrà -127 ma se lo invii ad un device che gestisce i byte come 0...255 per lui sarà 129.

Se invece a te su android servirà riconvertire il byte ricevuto dal device in un integer unsigned allora ti basta fare
Codice (Java): [Seleziona]
int i = byteRicevuto & 0xff;