在Java中将short转换为byte

我怎样才能将short (2字节)转换为Java中的字节数组,例如

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

它应该是这样的。 但不确定。

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

编辑:

你也可以使用:

 java.nio.ByteOrder.nativeOrder(); 

发现是否本地位的大小。 另外,下面的代码是从java.io.Bits中得到的:

  • 字节(数组/偏移量)为布尔值
  • 字节数组到char
  • 字节数组简写
  • 字节数组为int
  • 字节数组浮动
  • 字节数组
  • 字节数组加倍

而且反之亦然。

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

一个更清洁,虽然效率低得多的解决scheme是:

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

请记住,将来您必须进行更复杂的字节转换。 ByteBuffers非常强大。

另一种更有效的方法是:

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

想通了,其:

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

这取决于你想如何表示它:

  • 大端或小端? 这将决定您将字节放入哪个顺序。

  • 你想使用2的补码或其他方式来表示一个负数? 您应该使用与java中的short相同范围的scheme进行1对1的映射。

对于大端,转换应该是:ret [0] = x / 256; ret [1] = x%256;

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

这里提到了几种方法。 但是哪一个是最好的? 下面是一些证据,certificate以下三种方法可以得到相同的输出,用于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); 

结论:less就是多?

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

(正如其他答案已经提到,注意LE / BE )。

短到字节

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