Gestire Array di unsigned byte

di il
4 risposte

Gestire Array di unsigned byte

Ciao a tutti, sviluppo in c++ da diverso tempo e ora mi trovo ad affrontare la ricezione via seriale di un Array di byte da un embedded. Ma ora mi trovo con questo dilemma. Ho un int o un double che ho convertito Array di unsigned byte, che in c++ ha il range 0-255.
Quando ricevo l'array in java, trovo un Array in signed byte. Ora, a parte la banale conversione in int (& FF). Come posso ricostruire un int o un double? Ho le idee un po' confuse.... Help!!!!

4 Risposte

  • Re: Gestire Array di unsigned byte

    dakyn ha scritto:


    Quando ricevo l'array in java, trovo un Array in signed byte.
    Java non ha tipi unsigned (a parte il caso particolare di char)

    dakyn ha scritto:


    Ora, a parte la banale conversione in int (& FF). Come posso ricostruire un int o un double? Ho le idee un po' confuse.... Help!!!!
    Intendi un int o double da una sequenza di n (4 per int o 8 per double) byte?
    Dipende innanzitutto se sono memorizzati in Big-Endian o Little-Endian.
  • Re: Gestire Array di unsigned byte

    Dunque uso Little-Endian sono su ARM, alcuni esempi:

    Per int in c++
    
    int myInt = 267;
    byte myIntArray[2];
    memcpy(myIntArray,&myInt,2);
    
    Per double in c++
    
    double myDouble = 5.4;
    byte myDouble[4];
    char* myDouble = reinterpret_cast<char*>(&myDouble );
    
    I 2 array fanno parte di un array completo di molti byte.
    Quindi in Java ricevo un array che, sapendo la sequenza a priori, scompongo in una mia classe preposta e recupero le varia informazioni.

    Quindi, finché ho un valore a singolo byte non è un problema, ma quando incontro questi non so come affrontare il problema.
    Ti ringrazio in anticipo per qualsiasi aiuto.
  • Re: Gestire Array di unsigned byte

    dakyn ha scritto:


    Quindi in Java ricevo un array che, sapendo la sequenza a priori, scompongo in una mia classe preposta e recupero le varia informazioni.

    Quindi, finché ho un valore a singolo byte non è un problema, ma quando incontro questi non so come affrontare il problema.
    Semplicemente il concetto basilare che si può applicare è quello di usare operazioni di OR e shift sui bit per andare a ricomporre un valore primitivo da una sequenza di N byte che lo compongono.

    Se in Java ho un array di n byte e so che all'indice i ci sono 4 byte che formano un int (32 bit) e questo è memorizzato nell'array in Little-Endian (il byte più "basso" per PRIMO), allora si può fare:
    byte[] arr = ........
     
    int v = (arr[i+3] & 0xFF) << 24 |
            (arr[i+2] & 0xFF) << 16 |
            (arr[i+1] & 0xFF) << 8 |
            arr[i] & 0xFF;
    Questo è possibile e vale in modo equivalente/similare per TUTTI i linguaggi che permettono operazioni di AND/OR/NOT/shift sui bit. E puoi fare tutte le varianti che vuoi sapendo l'Endian e sapendo quanti byte servono in base al tipo che vuoi trattare. Tutto qui.

    Se poi non vuoi dover scrivere tutto questo a mano .... beh, di utilità del genere ce ne sono di già fatte.
    Nel framework standard di Java:
    - le classi di I/O DataInputStream e DataOutputStream sono in grado di trattare valori primitivi SOLO in Big-Endian.
    - le classi dei "buffer" nel package java.nio permettono il passaggio da sequenze di byte a valori primitivi potendo anche scegliere il byte-order (l'Endian).

    Dovrei anche andare a vedere se le note librerie Apache Commons IO e/o Commons Codec e/o la Google Guava offrono funzionalità del genere, che ora non ricordo.
  • Re: Gestire Array di unsigned byte

    Andbin ti ringrazio molto, le tue indicazioni sono molto preziose, grazie e spero, primo o poi a buon rendere.
Devi accedere o registrarti per scrivere nel forum
4 risposte