Подтвердить что ты не робот

Преобразование short в байт [] в Java

Как преобразовать short (2 байта) в массив байтов в Java, например.

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

...

это должно быть что-то вроде этого. Но не уверен.

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

EDIT:

Также вы можете использовать:

java.nio.ByteOrder.nativeOrder();

Чтобы узнать, является ли собственный бит-порядок большим или малым. Кроме того, следующий код берется из java.io.Bits, который делает:

  • byte (array/offset) для boolean
  • массив байтов char
  • массив байтов для коротких
  • массив байтов в int
  • массив байтов для float
  • массив байтов длиной
  • массив байтов удваивает

И наоборот.

4b9b3361

Ответ 1

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

Ответ 2

Чище, хотя и гораздо менее эффективное решение:

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

Помните об этом, когда вам нужно будет делать более сложные преобразования байтов в будущем. ByteBuffers очень мощные.

Ответ 3

Альтернатива, которая более эффективна:

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

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

Ответ 4

Выяснил это, его:

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

Ответ 5

Это зависит от того, как вы хотите его представлять:

  • big endian или little endian? Это определит, в каком порядке вы помещаете байты.

  • Вы хотите использовать 2 дополнения или какой-либо другой способ представления отрицательного числа? Вы должны использовать схему, которая имеет тот же диапазон, что и short в java, для отображения 1 к 1.

Для большого эндиана преобразование должно быть следующим:  ret [0] = x/256; ret [1] = x% 256;

Ответ 6

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

Ответ 7

Здесь упоминаются несколько методов. Но какой из них лучше? Здесь следует некоторое доказательство того, что следующие 3 подхода приводят к тому же выводу для всех значений a 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);

Заключение: меньше?

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

(Как упоминалось в других ответах, обратите внимание на LE/BE).

Ответ 8

short to 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)));

байт на короткий

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

Ответ 9

Метод преобразования short to bytes В Kotlin работает для меня:

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