Pregunta

¿Cómo se produce un entero sin signo de 16 bits y un entero sin signo de 64 bits en Java? Esta pregunta está relacionada con la implementación de un estándar. No estoy en condiciones de cambiar la especificación.

Otros bits quizás relevantes de la espec. Esta pregunta está relacionada con:

  • El bit más significativo debe ser 0.
  • debe expresarse en el orden de bytes de red.

Contexto de la aplicación: el número (en cualquier forma) representa la duración de los datos que se envían. La longitud puede ser grande o pequeña. Primero encontré que la longitud del mensaje se enviará como una larga.

Así que estoy empezando con: long length = getLength();

Luego necesito convertir la larga variable "longitud" en cualquiera de los dos anteriores, dependiendo de qué tan grande sea. Al final, estoy bastante seguro de que necesitaré hacer un .getBytes() Cuando envío la longitud. El destinatario interpretará como se describe anteriormente.

¿Fue útil?

Solución

Si el bit más significativo debe ser cero, entonces el número es el mismo si está firmado o sin firmar (suponiendo la representación del complemento de un dos). Entonces, por ejemplo, los enteros de 16 bits con el msb cero representan los números de 0 a 32767 inclusivo.

Asumiendo que estás escribiendo a un OutputStream y que su definición de "orden de red" es el byte más significativo primero, entonces debe hacer algo como esto:

public void writeShort(OutputStream os, short s) throws IOException {
    os.write((byte) (s >> 8));
    os.write((byte) s);
}

y

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);
}

Tenga en cuenta que estos trabajos para enteros firmados y sin firmar. (O para ser más precisos para el contexto de Java, funcionan si el argumento representa un entero firmado o sin firmar.)

Otros consejos

Java no tiene tipos de datos sin firmar (ver aquí: http://darksleep.com/player/javaandunsignedtypes.html)

int tiene 32 bits, largo tiene 64 bits, short tiene 16 bits

¿Es tan malo almacenarlo todo el mismo tiempo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top