如何在Java中将short
(2个字节)转换为字节数组,例如
short x = 233;
byte[] ret = new byte[2];
...
它应该是这样的。但不确定。
((0xFF << 8) & x) >> 0;
编辑:
您也可以使用:
java.nio.ByteOrder.nativeOrder();
发现以获取本机位顺序是大还是小。此外,以下代码取自java.io.Bits
,其中包含:
反之亦然。
答案 0 :(得分:69)
ret[0] = (byte)(x & 0xff);
ret[1] = (byte)((x >> 8) & 0xff);
答案 1 :(得分:33)
一个更清洁,虽然效率低得多的解决方案是:
ByteBuffer buffer = ByteBuffer.allocate(2);
buffer.putShort(value);
return buffer.array();
将来要进行更复杂的字节转换时请记住这一点。 ByteBuffers非常强大。
答案 2 :(得分:13)
更有效的替代方案:
// Little Endian
ret[0] = (byte) x;
ret[1] = (byte) (x >> 8);
// Big Endian
ret[0] = (byte) (x >> 8);
ret[1] = (byte) x;
答案 3 :(得分:7)
想出来,它的:
public static byte[] toBytes(short s) {
return new byte[]{(byte)(s & 0x00FF),(byte)((s & 0xFF00)>>8)};
}
答案 4 :(得分:3)
这取决于你想表达它的方式:
big endian还是little endian?这将决定你把字节放在哪个顺序。
您想使用2的补码或其他表示负数的方法吗?您应该使用与java中的short相同范围的方案来进行1对1映射。
对于大端,转换应该遵循: ret [0] = x / 256; ret [1] = x%256;
答案 5 :(得分: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;
}
答案 6 :(得分:1)
这里提到了几种方法。但哪一个最好?以下是一些证明以下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)。
答案 7 :(得分:1)
短字节转换方法在Kotlin为我工作:
fun toBytes(s: Short): ByteArray {
return byteArrayOf((s.toInt() and 0x00FF).toByte(), ((s.toInt() and 0xFF00) shr (8)).toByte())
}
答案 8 :(得分: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]);