55

shortJavaで(2バイト)をバイト配列に変換するにはどうすればよいですか?

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

...

このようなものでなければなりません。しかし、よくわかりません。

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

編集:

また、使用することができます:

java.nio.ByteOrder.nativeOrder();

ネイティブビットの順序が大きいか小さいかを確認するため。さらに、次のコードが取得されますjava.io.Bits

  • バイト(配列/オフセット)からブール値
  • 文字へのバイト配列
  • バイト配列を短くする
  • バイト配列からint
  • フロートするバイト配列
  • バイト配列から長い
  • 2倍にするバイト配列

逆もまた同様です。

4

9 に答える 9

82
ret[0] = (byte)(x & 0xff);
ret[1] = (byte)((x >> 8) & 0xff);
于 2010-02-02T23:56:26.497 に答える
47

はるかに効率の悪い解決策ではありますが、よりクリーンなソリューションは次のとおりです。

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

将来、より複雑なバイト変換を行う必要がある場合は、このことに注意してください。ByteBuffersは非常に強力です。

于 2011-06-24T19:39:55.493 に答える
19

より効率的な代替案:

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

    // Big Endian
    ret[0] = (byte) (x >> 8);
    ret[1] = (byte) x;
于 2013-05-24T11:41:23.680 に答える
7

それを理解しました、その:

public static byte[] toBytes(short s) {
    return new byte[]{(byte)(s & 0x00FF),(byte)((s & 0xFF00)>>8)};
}
于 2010-02-02T23:57:39.917 に答える
7

ショートからバイトへの変換メソッドKotlinでは次のように機能します。

 fun toBytes(s: Short): ByteArray {
    return byteArrayOf((s.toInt() and 0x00FF).toByte(), ((s.toInt() and 0xFF00) shr (8)).toByte())
}
于 2017-12-20T11:45:32.723 に答える
4

ここではいくつかの方法について説明しました。しかし、どれが最高ですか?以下の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に注意してください)。

于 2015-08-17T11:13:29.410 に答える
3

それはあなたがそれをどのように表現したいかによります:

  • ビッグエンディアンまたはリトルエンディアン?これにより、バイトをどの順序で配置するかが決まります。

  • 2の補数を使用しますか、それとも負の数を表す他の方法を使用しますか?1対1のマッピングを行うには、Javaのshortと同じ範囲のスキームを使用する必要があります。

ビッグエンディアンの場合、変換は次の線に沿っている必要があります。ret [0] = x / 256; ret [1] = x%256;

于 2010-02-02T23:59:18.793 に答える
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;
}
于 2013-08-08T06:27:04.210 に答える
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]);
于 2015-11-17T04:38:36.663 に答える