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.

È stato utile?

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 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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top