在J中将short转换为byte []

如何在Java中将java.io.Bits(2个字节)转换为字节数组,例如

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

...

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

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

编辑:

您也可以使用:

java.nio.ByteOrder.nativeOrder();

发现以获取本机位顺序是大还是小。 此外,以下代码取自java.io.Bits,该代码可以:

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

反之亦然。

Hugh asked 2020-02-14T03:31:02Z
9个解决方案
71 votes
ret[0] = (byte)(x & 0xff);
ret[1] = (byte)((x >> 8) & 0xff);
Alexander Gessler answered 2020-02-14T03:43:24Z
34 votes

一个更清洁,效率更低的解决方案是:

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

当您将来需要执行更复杂的字节转换时,请记住这一点。 ByteBuffers非常强大。

Gili answered 2020-02-14T03:43:49Z
14 votes

一种更有效的选择:

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

    // Big Endian
    ret[0] = (byte) (x >> 8);
    ret[1] = (byte) x;
David answered 2020-02-14T03:44:09Z
7 votes

想通了,其:

public static byte[] toBytes(short s) {
    return new byte[]{(byte)(s & 0x00FF),(byte)((s & 0xFF00)>>8)};
}
Hugh answered 2020-02-14T03:44:29Z
3 votes

这取决于您要如何表示:

  • 大端还是小端? 这将确定您将字节放入哪个顺序。

  • 您是否要使用2的补码或其他表示负数的方式? 您应该使用与Java中的short范围相同的方案来进行一对一映射。

对于大端,转换应遵循以下原则:  ret [0] = x / 256; ret [1] = x%256;

abc answered 2020-02-14T03:45:04Z
1 votes
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;
}
Scott Izu answered 2020-02-14T03:45:20Z
1 votes

这里提到了几种方法。 但是哪个是最好的? 以下是一些证明,证明以下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)。

bvdb answered 2020-02-14T03:45:51Z
1 votes

短字节转换方法在Kotlin中为我工作:

 fun toBytes(s: Short): ByteArray {
    return byteArrayOf((s.toInt() and 0x00FF).toByte(), ((s.toInt() and 0xFF00) shr (8)).toByte())
}
Serg Burlaka answered 2020-02-14T03:46:12Z
0 votes

短字节

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]);
chitrendra chaudhary answered 2020-02-14T03:46:36Z
translate from https://stackoverflow.com:/questions/2188660/convert-short-to-byte-in-java