Convert short to byte[] in Java

前端 未结 9 660
旧巷少年郎
旧巷少年郎 2020-11-30 03:48

How can I convert a short (2 bytes) to a byte array in Java, e.g.

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

...

it should be s

相关标签:
9条回答
  • 2020-11-30 04:15

    It depends how you want to represent it:

    • big endian or little endian? That will determine which order you put the bytes in.

    • Do you want to use 2's complement or some other way of representing a negative number? You should use a scheme that has the same range as the short in java to have a 1-to-1 mapping.

    For big endian, the transformation should be along the lines of: ret[0] = x/256; ret[1] = x%256;

    0 讨论(0)
  • 2020-11-30 04:18

    Several methods have been mentioned here. But which one is the best? Here follows some proof that the following 3 approaches result in the same output for all values of 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);
    

    Conclusion: less is more ?

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

    (As other answers have mentioned, watch out for LE/BE).

    0 讨论(0)
  • 2020-11-30 04:25

    An alternative that is more efficient:

        // Little Endian
        ret[0] = (byte) x;
        ret[1] = (byte) (x >> 8);
    
        // Big Endian
        ret[0] = (byte) (x >> 8);
        ret[1] = (byte) x;
    
    0 讨论(0)
提交回复
热议问题