2010-02-02 1 views
40

Come posso convertire un short (2 byte) in un array di byte in Java, ad es.Converti short to byte [] in Java

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

... 

dovrebbe essere qualcosa del genere. Ma non sono sicuro.

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

EDIT:

Inoltre è possibile utilizzare:

java.nio.ByteOrder.nativeOrder(); 

Per scoprire per ottenere se l'ordine bit nativo è grande o piccolo. Inoltre il codice seguente è tratta da java.io.Bits che fa:

  • byte (matrice/offset) a booleano
  • byte a char
  • byte a breve matrice
  • byte int
  • matrice di byte di galleggiare
  • matrice di byte lunga serie
  • byte di raddoppiare

E viceversa.

+0

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

risposta

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

Ah grazie. Ho pubblicato anche un metodo. – Hugh

+32

Questo è little endian, però. L'ordine dei byte di rete è big endian: 'byte [] arr = nuovo byte [] {(byte) ((x >> 8) & 0xFF), (byte) (x & 0xFF)}; –

+2

Potrebbe funzionare anche 'byte [] arr = nuovo byte [] {(byte) (x >>> 8), (byte) (x & 0xFF)}' – Javier

7

capito, la sua:

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

Dipende da come si vuole rappresentarlo:

  • big endian o little endian? Ciò determinerà l'ordine in cui inserisci i byte.

  • Vuoi utilizzare il complemento a 2 o un altro modo di rappresentare un numero negativo? Dovresti utilizzare uno schema che abbia lo stesso intervallo del cortometraggio in java per avere un mapping 1-a-1.

Per grande endian, la trasformazione dovrebbe essere lungo le linee di: ret [0] = x/256; ret [1] = x% 256;

33

Un pulitore, anche se la soluzione di gran lunga meno efficiente è:

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

Tenetelo a mente quando si ha a che fare trasformazioni byte più complesse in futuro. I ByteBuffer sono molto potenti.

+0

È necessario un capovolgimento del buffer? Se sì, a cosa serve? – abimelex

+2

@abimelex, sì è necessario. Inizialmente scrivi 2 byte nella posizione 0, 1. Se non esegui 'buffer.flip()' allora 'buffer.array()' leggerà 'byte []' a partire dalla posizione 2. 'buffer.flip()' imposta la posizione su 0 e il limite su 2 in modo da ottenere una matrice di dimensione 2 che inizia nella posizione corretta. Dai un'occhiata a Javadoc: http://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html#flip() – Gili

+0

@Gili No, il flip() non è necessario. buffer.array() restituisce semplicemente l'array backing byte []. Quindi se stai semplicemente ottenendo la rappresentazione dei byte usando l'array, non c'è bisogno di capovolgere(). Tuttavia, se stai leggendo la rappresentazione dei byte usando ByteBuffer direttamente, dovresti flip(). –

11

Un'alternativa che è più efficiente:

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

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

Non dovrebbe essere il contrario? Cioè il primo è little-endian e il secondo è big-endian. –

+1

Hai ragione ... hai aggiornato la risposta. Grazie – David

+0

Non c'è un '& 0xFF' necessario per il byte meno 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

Diversi metodi sono stati menzionati qui. Ma qual'è il migliore?Qui di seguito alcuni prova che i seguenti 3 approcci portano alla stessa uscita per tutti i valori di un 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); 

Conclusione: meno è di più?

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

(Come altre risposte hanno detto, guardare fuori per LE/BE).

0

breve per 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 breve

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

corto di byte convertire metodo In Kotlin funziona per me:

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

Questa domanda è contrassegnata per Java, non Kotlin. – Gili