Javaでshort
(2バイト)をバイト配列に変換するにはどうすればよいですか。
short x = 233;
byte[] ret = new byte[2];
...
このようなものでなければなりません。しかし、よくわかりません。
((0xFF << 8) & x) >> 0;
編集:
また、使用することができます:
Java.nio.ByteOrder.nativeOrder();
ネイティブのビット順序が大きいか小さいかを知るため。さらに、次のコードはJava.io.Bits
そしてその逆。
ret[0] = (byte)(x & 0xff);
ret[1] = (byte)((x >> 8) & 0xff);
より効率的ではありませんが、よりクリーンなソリューションは次のとおりです。
ByteBuffer buffer = ByteBuffer.allocate(2);
buffer.putShort(value);
return buffer.array();
将来、より複雑なバイト変換を行う必要がある場合は、このことに留意してください。 ByteBufferは非常に強力です。
より効率的な代替案:
// 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の補数または負の数を表す他の方法を使用しますか? 1対1のマッピングを行うには、Javaの短縮形と同じ範囲のスキームを使用する必要があります。
ビッグエンディアンの場合、変換は次の行に沿っている必要があります。ret[0] = x/256; ret [1] = x%256;
Kotlinのバイトへの短い変換方法は私のために機能します:
fun toBytes(s: Short): ByteArray {
return byteArrayOf((s.toInt() and 0x00FF).toByte(), ((s.toInt() and 0xFF00) shr (8)).toByte())
}
いくつかの方法がここで言及されています。しかし、どれが最高ですか?以下は、次の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 )に注意してください。
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;
}
バイトに短い
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]);