Ale*_*ing 26 java byte integer bytearray
我有一个byte[]我从文件中读取的内容,我希望从中获取int两个字节.这是一个例子:
byte[] bytes = new byte[] {(byte)0x00, (byte)0x2F, (byte)0x01, (byte)0x10, (byte)0x6F};
int value = bytes.getInt(2,4); //This method doesn't exist
Run Code Online (Sandbox Code Playgroud)
这应该value等于0x0110或272十进制.但显然,byte[].getInt()不存在.我怎样才能完成这项任务?
上面的数组只是一个例子.实际值对我来说不了解.
pax*_*blo 40
你应该选择简单的方法:
int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);
Run Code Online (Sandbox Code Playgroud)
你甚至可以编写自己的帮助函数getBytesAsWord (byte[] bytes, int start)来为你提供功能,如果你不想让你的代码计算,但我认为这可能是过度的.
尝试:
public static int getInt(byte[] arr, int off) {
return arr[off]<<8 &0xFF00 | arr[off+1]&0xFF;
} // end of getInt
Run Code Online (Sandbox Code Playgroud)
你的问题没有说明两个args(2,4)的含义.在你的例子中,2和4没有意义,因为数组中的索引找到了ox01和0x10,我猜你想要连续两个元素,这是常见的事情,所以我在我的方法中使用off和off + 1.
你不能在java中扩展byte []类,所以你不能有一个方法bytes.getInt,所以我创建了一个静态方法,它使用byte []作为第一个arg.
该方法的"技巧"是你的字节是8位有符号整数,超过0x80的值是负数,并且将被符号扩展(即当用作int时为0xFFFFFF80).这就是需要'&0xFF'掩蔽的原因.'<< 8'将更重要的字节8位移位.'|' 结合这两个值 - 就像'+'一样.运算符的顺序很重要,因为<<具有最高优先级,后跟&后跟| - 因此不需要括号.
这是一个很好的简单可靠的方法。
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4);
// by choosing big endian, high order bytes must be put
// to the buffer before low order bytes
byteBuffer.order(ByteOrder.BIG_ENDIAN);
// since ints are 4 bytes (32 bit), you need to put all 4, so put 0
// for the high order bytes
byteBuffer.put((byte)0x00);
byteBuffer.put((byte)0x00);
byteBuffer.put((byte)0x01);
byteBuffer.put((byte)0x10);
byteBuffer.flip();
int result = byteBuffer.getInt();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40071 次 |
| 最近记录: |