题 在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 这样做:

  • byte(array / offset)为boolean
  • 字节数组为char
  • 字节数组要短
  • 字节数组为int
  • 要浮动的字节数组
  • 字节数组为long
  • 字节数组加倍

反之亦然。


41
2018-02-02 23:51


起源


stackoverflow.com/questions/3114935/... - LadyDi


答案:


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

63
2018-02-02 23:56



啊,谢谢。我也发布了一个方法。 - Hugh
不过那是小端。网络字节顺序是大端:'byte [] arr = new byte [] {(byte)((x >> 8)&0xFF),(byte)(x&0xFF)}; - Lawrence Dol
这也可以 byte[] arr=new byte[]{(byte)(x>>>8),(byte)(x&0xFF)} - Javier
我可以在这里问一下,为什么在将一个short或int to byte转换为只需要LSB时需要屏蔽?谢谢 - JonnoHampson
掩蔽是超级的。无论如何,转换为字节都会截断高位,因此将它们屏蔽掉是完全没有意义的。 - Durandal


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

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

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


33
2018-06-24 19:39



缓冲翻转是否必要?如果是的话,有什么好处? - abimelex
@abimelex,是的,这是必要的。最初你在0,1位写入2个字节。如果不这样做 buffer.flip() 然后 buffer.array() 会读 byte[] 从第2位开始。 buffer.flip() 将位置设置为0,将限制设置为2,这样您就可以从正确的位置开始使用大小为2的数组。看看Javadoc: docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html#flip() - Gili
@Gili不,翻盖()不是必需的。 buffer.array()只返回backing byte []数组。因此,如果您只是想使用数组获取字节表示,则无需flip()。但是,如果要直接使用ByteBuffer读取字节表示,则应该使用flip()。 - Janus Varmarken
@jvmk,乍一看。你是对的。我已经纠正了答案。 - Gili
我们说话的效率有多低? - Barodapride


一种更有效的替代方案:

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

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

11
2018-05-24 11:41



不应该是相反的方式吗?即第一个是小端,第二个是大端。 - Robby Cornelissen
你是对的......更新了答案。谢谢 - David
不存在吗? & 0xFF 最不重要的字节需要什么? - bvdb
@bvdb:不需要使用0xFF进行位掩码,因为一个字节已经是8位。 - David
@David谢谢,仔细检查并确认。 :) - bvdb


弄清楚了,它:

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

7
2018-02-02 23:57





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

  • 大端还是小端?这将决定你把字节放在哪个顺序。

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

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


3
2018-02-02 23:59





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
2017-08-08 06:27





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


1
2017-08-17 11:13





字节短

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

0
2017-11-17 04:38





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

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

0
2017-12-20 11:45



这个问题标记为Java,而不是Kotlin。 - Gili