2010-02-02 25 views
40

¿Cómo puedo convertir un short (2 bytes) a una matriz de bytes en Java, p. Ej.Convertir corto a byte [] en Java

short x = 233; 
byte[] ret = new byte[2]; 

... 

debería ser algo como esto. Pero no estoy seguro.

((0xFF << 8) & x) >> 0; 

EDIT:

También se puede usar:

java.nio.ByteOrder.nativeOrder(); 

Para descubrir conseguir si el orden de los bits nativa es grande o pequeño. Además, el código siguiente se toma de java.io.Bits que hace:

  • byte (array/offset) a Boolean
  • matriz de bytes a char
  • matriz de bytes a corto array
  • byte a int
  • matriz de bytes para flotar
  • matriz de bytes a largo array
  • byte duplicar

Y viceversa.

+0

http://stackoverflow.com/ preguntas/3114935/convert-from-short-to-byte-and-viceversa-in-java? rq = 1 – LadyDi

Respuesta

59
ret[0] = (byte)(x & 0xff); 
ret[1] = (byte)((x >> 8) & 0xff); 
+1

Ah, gracias. También he publicado un método. – Hugh

+32

Eso es poco endian, sin embargo. El orden de bytes de red es big endian: 'byte [] arr = nuevo byte [] {(byte) ((x >> 8) & 0xFF), (byte) (x & 0xFF)}; –

+2

Esto podría funcionar también 'byte [] arr = byte nuevo [] {(byte) (x >>> 8), (byte) (x & 0xFF)}' – Javier

7

lo descubrió, su:

public static byte[] toBytes(short s) { 
    return new byte[]{(byte)(s & 0x00FF),(byte)((s & 0xFF00)>>8)}; 
} 
3

depende de cómo desea que la represente:

  • big endian o little endian? Eso determinará en qué orden colocar los bytes.

  • ¿Desea utilizar el complemento de 2 o alguna otra forma de representar un número negativo? Debe usar un esquema que tenga el mismo rango que el corto en java para tener una asignación de 1 a 1.

Para big endian, la transformación debería ser a lo largo de las líneas de: ret [0] = x/256; ret [1] = x% 256;

33

Un limpiador, aunque la solución es mucho menos eficiente:

ByteBuffer buffer = ByteBuffer.allocate(2); 
buffer.putShort(value); 
return buffer.array(); 

Tenga esto en cuenta cuando se tiene que hacer transformaciones byte más complejas en el futuro. Los ByteBuffers son muy poderosos.

+0

¿Es necesario voltear el búfer? Si es así, ¿para qué sirve? – abimelex

+2

@abimelex, sí es necesario. Inicialmente escribes 2 bytes en la posición 0, 1. Si no 'buffer.flip() ',' buffer.array() 'leerá' byte [] 'comenzando en la posición 2.' buffer.flip() ' establece la posición en 0 y el límite en 2, por lo que termina con una matriz de tamaño 2 comenzando en la posición correcta. Eche un vistazo al Javadoc: http://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html#flip() – Gili

+0

@Gili No, el flip() no es necesario. buffer.array() simplemente devuelve la matriz de bytes de respaldo []. Entonces, si simplemente va a obtener la representación de bytes utilizando la matriz, no hay necesidad de voltear(). Sin embargo, si va a leer la representación de bytes utilizando ByteBuffer directamente, debe voltear(). –

11

Una alternativa que es más eficiente: se han mencionado aquí

// Little Endian 
    ret[0] = (byte) x; 
    ret[1] = (byte) (x >> 8); 

    // Big Endian 
    ret[0] = (byte) (x >> 8); 
    ret[1] = (byte) x; 
+0

¿No debería ser al revés? Es decir. el primero es little-endian y el segundo es big-endian. –

+1

Tienes razón ... actualizó la respuesta. Gracias – David

+0

¿No hay un '& 0xFF' necesario para el byte menos significativo? – bvdb

1
public short bytesToShort(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getShort(); 
} 

public byte[] shortToBytes(short value) { 
    byte[] returnByteArray = new byte[2]; 
    returnByteArray[0] = (byte) (value & 0xff); 
    returnByteArray[1] = (byte) ((value >>> 8) & 0xff); 
    return returnByteArray; 
} 
1

varios métodos. Pero, ¿cuál es el mejor?Aquí sigue una prueba de que los siguientes 3 enfoques dan lugar a la misma salida para todos los valores de una Conclusión short

// loops through all the values of a Short 
    short i = Short.MIN_VALUE; 
    do 
    { 
    // method 1: A SIMPLE SHIFT 
    byte a1 = (byte) (i >> 8); 
    byte a2 = (byte) i; 

    // method 2: AN UNSIGNED SHIFT 
    byte b1 = (byte) (i >>> 8); 
    byte b2 = (byte) i; 

    // method 3: SHIFT AND MASK 
    byte c1 = (byte) (i >> 8 & 0xFF); 
    byte c2 = (byte) (i & 0xFF); 

    if (a1 != b1 || a1 != c1 || 
     a2 != b2 || a2 != c2) 
    { 
     // this point is never reached !! 
    } 
    } while (i++ != Short.MAX_VALUE); 

: menos es más?

byte b1 = (byte) (s >> 8); 
byte b2 = (byte) s; 

(Como han mencionado otras respuestas, cuidado con los LE/BE).

0

corta a byte

short x=17000;  
byte res[]=new byte[2];  
res[i]= (byte)(((short)(x>>7)) & ((short)0x7f) | 0x80);  
res[i+1]= (byte)((x & ((short)0x7f))); 

byte a corto

short x=(short)(128*((byte)(res[i] &(byte)0x7f))+res[i+1]); 
1

corto para convertir bytes método En Kotlin funciona para mí:

fun toBytes(s: Short): ByteArray { 
    return byteArrayOf((s.toInt() and 0x00FF).toByte(), ((s.toInt() and 0xFF00) shr (8)).toByte()) 
} 
+0

Esta pregunta está etiquetada para Java, no para Kotlin. – Gili