将4个字节转换为整数

76
我正在以以下方式读取二进制文件:

InputStream in = new FileInputStream( file );
byte[] buffer = new byte[1024];
while( ( in.read(buffer ) > -1 ) {

   int a = // ??? 
}
我想做的是读取最多4个字节并从中创建一个int值,但我不知道该如何做。
我觉得我需要每次获取4个字节,并执行一个"字节"操作(例如>> << >>&FF之类的操作)来创建新的int。
这个操作的习语是什么?
编辑
哎呀,这有点复杂(解释起来)。
我正在尝试读取一个文件(可能是ascii,二进制,都无所谓),并提取其中可能有的整数。
例如,假设二进制内容(在基数2中):
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010
整数表示应该是12,对吧? :- / 前32位为1,后32位为2。
11111111 11111111 11111111 11111111

会是 -1

01111111 11111111 11111111 11111111

最大值为 Integer.MAX_VALUE (2147483647)

12个回答

0

将一个4字节数组转换为整数:

//Explictly declaring anInt=-4, byte-by-byte
byte[] anInt = {(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xfc}; // Equals -4
//And now you have a 4-byte array with an integer equaling -4...
//Converting back to integer from 4-bytes...
result = (int) ( anInt[0]<<24 | ( (anInt[1]<<24)>>>8 ) | ( (anInt[2]<<24)>>>16) | ( (anInt[3]<<24)>>>24) );

0
以下代码从array(一个byte[])的位置index读取4个字节,并返回一个int。我在Java 10上尝试了其他答案中的大部分代码以及我构想的一些其他变体。
这段代码使用最少的CPU时间,但会分配一个ByteBuffer,直到Java 10的JIT消除该分配为止。
int result;

result = ByteBuffer.
   wrap(array).
   getInt(index);

这段代码是性能最佳的代码,不需要分配任何内存。不幸的是,与上面的代码相比,它消耗了56%更多的CPU时间。

int result;
short data0, data1, data2, data3;

data0  = (short) (array[index++] & 0x00FF);
data1  = (short) (array[index++] & 0x00FF);
data2  = (short) (array[index++] & 0x00FF);
data3  = (short) (array[index++] & 0x00FF);
result = (data0 << 24) | (data1 << 16) | (data2 << 8) | data3;

1
如果您这样做:(array[i] << 24) | ((array[i + 1] & 0xff) << 16) | ((array[i + 2] & 0xff) << 8) | (array[i + 3] & 0xff)(即,不先转换为short),它与ByteBuffer解决方案一样有效。我猜它可能被优化为一个常见的模式。 - john16384

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接