Senza segno a 16 e 64 bit interi
-
26-10-2019 - |
Domanda
Come si fa a produrre un numero intero senza segno a 16 bit e un bit 64 intero senza segno in Java? Questa domanda è legata alla attuazione di uno standard. Io non sono in grado di modificare le specifiche.
Altri bit forse rilevanti del spec. questa domanda è legata a:
- bit più significativo DEVE essere 0.
- deve essere espressa in ordine di byte di rete.
context Applicazione: Il numero (sia in forma) rappresenta la lunghezza dei dati inviati. La lunghezza può essere grande o piccolo. Ho trovato prima la lunghezza del messaggio da inviare come un lungo.
Quindi, sto iniziando con: long length = getLength();
Ho quindi bisogno di convertire la "lunghezza" lungo variabile per uno dei due di cui sopra, a seconda di quanto è grande. Alla fine, sono abbastanza sicuro che avrò bisogno di fare un .getBytes()
quando invio la lunghezza. Il destinatario interpreterà come descritto in precedenza.
Soluzione
Se il bit più significativo deve essere zero, allora il numero è lo stesso se è con o senza segno (assumendo la rappresentanza di un complemento a due). Così, per esempio, 16 bit interi con il MSB a zero rappresentano i numeri da 0
a 32767
compreso.
Supponendo che si sta scrivendo a un OutputStream
e che la tua definizione di "ordine di rete" è il byte più significativo prima, allora avete bisogno di fare qualcosa di simile:
public void writeShort(OutputStream os, short s) throws IOException {
os.write((byte) (s >> 8));
os.write((byte) s);
}
e
public void writeLong(OutputStream os, long l) throws IOException {
os.write((byte) (l >> 56));
os.write((byte) (l >> 48));
os.write((byte) (l >> 40));
os.write((byte) (l >> 32));
os.write((byte) (l >> 24));
os.write((byte) (l >> 16));
os.write((byte) (l >> 8));
os.write((byte) l);
}
Si noti che queste opere per gli interi con e senza segno. (O per essere più precisi per il contesto Java, lavorano se l'argomento rappresenta ??em> un intero con o senza segno.)
Altri suggerimenti
Java non ha tipi di dati senza segno (vedi qui: http://darksleep.com/player/JavaAndUnsignedTypes.html )
int ha 32 bit, è da tempo a 64 bit, a breve ha 16bit
è così male per memorizzare tutto solo più a lungo?