鉴于
private int width = 400;
private byte [] data = new byte [2];
我想将整数“width”分成两个字节,并用高字节加载数据[0],用低字节加载数据[1]。
这是二进制值400 = 1 1001 0000 所以data [0]应该包含0000 0001 和数据[1]应包含1001 0000
答案 0 :(得分:78)
使用简单的按位操作:
data[0] = (byte) (width & 0xFF);
data[1] = (byte) ((width >> 8) & 0xFF);
工作原理:
& 0xFF
屏蔽除最低八位之外的所有内容。>> 8
通过将所有位向右移动8位来丢弃最低8位。int
并返回int
,这是一种比byte
更大的数据类型。这种情况是安全的,因为所有非零位都适合byte
。有关详细信息,请参阅Conversions and Promotions。 修改: Taylor L正确评论虽然>>
在这种情况下有效,但如果将此代码推广到 4 ,则可能会产生错误的结果bytes(因为在Java中int
是32位)。在这种情况下,最好使用>>>
代替>>
。有关详细信息,请参阅Java tutorial on Bitwise and Bit Shift Operators。
答案 1 :(得分:11)
为了转换两个字节,最干净的解决方案是
data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
为了将整数转换为四个字节,代码将是
data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
data[2] = (byte) (width >>> 16);
data[3] = (byte) (width >>> 24);
是否>>无关紧要或>>>用于移位,由符号扩展创建的任何一个位都不会以结果字节结束。
另见this answer。
答案 2 :(得分:4)
这应该为4字节int做你想要的。注意,它将低字节存储在偏移0处。我将把它作为练习留给读者根据需要订购它们。
public static byte[] intToBytes(int x) {
byte[] bytes = new byte[4];
for (int i = 0; x != 0; i++, x >>>= 8) {
bytes[i] = (byte) (x & 0xFF);
}
return bytes;
}
答案 3 :(得分:1)
java中的整数是32位(= 4字节),你知道吗?
宽度& 0xff会给你第一个字节, 宽度和宽度0xff00>> 8会给你第二个等等。
答案 4 :(得分:0)
int width = 400;
byte [] data = new byte [2];
data[0] = (byte) ((width & 0xFF00) >> 8);
data[1] = (byte) (width & 0xFF);
for(int b = 0; b < 2; b++) {
System.out.println("printing byte " + b);
for(int i = 7; i >= 0; i--) {
System.out.println(data[b] & 1);
data[b] = (byte) (data[b] >> 1);
}
}
答案 5 :(得分:0)
我建议您查看一下HeapByteBuffer的来源。它具有所有原始数据类型的转换代码。 (事实上你可以使用ByteBuffer;)
答案 6 :(得分:-1)
要获得高字节,请向右移8位,然后屏蔽顶部字节。同样,要使低字节只掩盖顶部字节。
data[0] = (width >> 8) & 0xff;
data[1] = width & 0xff;