2010-02-02 3 views
40

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

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

... 

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

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

EDIT:

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

java.nio.ByteOrder.nativeOrder(); 

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

  • байт (массив/смещение), чтобы булева
  • массива байт на символ
  • массива байт в короткий массив
  • байт в целое
  • байтовый массив, чтобы плавать
  • массив байтов в массиве длинного
  • байт в два раза

И наоборот.

+0

http://stackoverflow.com/ вопросы/3114935/convert-from-short-to-byte-and-viceversa-in-java? rq = 1 – LadyDi

ответ

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

Ах спасибо. Я также опубликовал метод. – Hugh

+32

Это немного, конечно. Сетевой байт-порядок является большим аргументом: 'byte [] arr = новый байт [] {(байт) ((x >> 8) & 0xFF), (байт) (x & 0xFF)}; –

+2

Это тоже может работать 'byte [] arr = new byte [] {(byte) (x >>> 8), (byte) (x & 0xFF)}' – Javier

7

Фигурные это, его:

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

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

  • большой Endian или Little Endian? Это определит, в каком порядке вы помещаете байты.

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

Для больших обратного порядка байт, преобразование должно быть вдоль линий: в отставке [0] = х/256; ret [1] = x% 256;

33

уборщик, хотя и гораздо менее эффективным решением является:

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

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

+0

Необходим ли буфер? Если да, для чего это полезно? – abimelex

+2

@abimelex, да необходимо. Сначала вы пишете 2 байта в позиции 0, 1. Если вы не используете 'buffer.flip()', то 'buffer.array()' будет читать 'byte []' начиная с позиции 2. 'buffer.flip()' задает положение 0 и предел до 2, поэтому вы получите массив размером 2, начиная с правого положения. Взгляните на Javadoc: http://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html#flip() – Gili

+0

@Gili Нет, флип() не требуется. buffer.array() просто возвращает массив backing byte []. Поэтому, если вы просто собираетесь получить представление байта с помощью массива, нет необходимости перевернуть(). Однако, если вы собираетесь читать представление байта, используя ByteBuffer напрямую, вам следует перевернуть(). –

11

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

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

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

Разве это не должно быть наоборот? То есть первый - мало-северный, а второй - большой. –

+1

Вы правы ... обновили ответ. Спасибо – David

+0

Не существует ли '& 0xFF' для наименее значимого байта? – 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

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

0

короткое байт

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]); 
1

Замыкание байт преобразовать метод В Котлин работает для меня:

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

Этот вопрос отмечен для Java, а не Kotlin. – Gili