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.