将4个字节转换为int

我在读这样的二进制文件:

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

我想要做的是读取4个字节,并创build一个int值,但是,我不知道该怎么做。

我觉得我必须一次抓取4个字节,然后执行一个“字节”操作(比如>> << >>&FF等)来创build新的int

这是什么成语?

编辑

哎呀,这变得有点复杂(解释)

我想要做的是读取一个文件(可能是ascii,二进制,没关系),并提取它可能有的整数。

例如,假设二进制内容(以2为底):

 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000010 

整数表示应该是2对吗? : – 前1个32位为/ 1,其余32位为2。

 11111111 11111111 11111111 11111111 

将是-1

 01111111 11111111 11111111 11111111 

Integer.MAX_VALUE ( 2147483647 )

ByteBuffer具有这种能力,并且能够同时处理小端和大端的整数。

考虑这个例子:

// read the file into a byte array File file = new File("file.bin"); FileInputStream fis = new FileInputStream(file); byte [] arr = new byte[(int)file.length()]; fis.read(arr); // create a byte buffer and wrap the array ByteBuffer bb = ByteBuffer.wrap(arr); // if the file uses little endian as apposed to network // (big endian, Java's native) format, // then set the byte order of the ByteBuffer if(use_little_endian) bb.order(ByteOrder.LITTLE_ENDIAN); // read your integers using ByteBuffer's getInt(). // four bytes converted into an integer! System.out.println(bb.getInt());
// read the file into a byte array File file = new File("file.bin"); FileInputStream fis = new FileInputStream(file); byte [] arr = new byte[(int)file.length()]; fis.read(arr); // create a byte buffer and wrap the array ByteBuffer bb = ByteBuffer.wrap(arr); // if the file uses little endian as apposed to network // (big endian, Java's native) format, // then set the byte order of the ByteBuffer if(use_little_endian) bb.order(ByteOrder.LITTLE_ENDIAN); // read your integers using ByteBuffer's getInt(). // four bytes converted into an integer! System.out.println(bb.getInt()); 

希望这可以帮助。

你应该把它放到这样一个函数中:

 public static int toInt(byte[] bytes, int offset) { int ret = 0; for (int i=0; i<4 && i+offset<bytes.length; i++) { ret <<= 8; ret |= (int)bytes[i] & 0xFF; } return ret; } 

例:

 byte[] bytes = new byte[]{-2, -4, -8, -16}; System.out.println(Integer.toBinaryString(toInt(bytes, 0))); 

输出:

 11111110111111001111100011110000 

这将处理用完字节并正确处理负字节值。

我不知道这样做的标准function。

需要考虑的问题:

  1. 字节顺序:不同的CPU体系结构把不同顺序的字节组成一个int。 根据你如何提出字节数组开始,你可能不得不担心这个; 和

  2. 缓冲:如果一次抓取1024个字节,并在元素1022处开始一个序列,那么在获得4个字节之前,您将碰到缓冲区的末端。 使用某种forms的缓冲inputstream可能会更好,因为您可以反复使用readByte() ,否则不用担心。

  3. 尾随缓冲区:input的结尾可能是不均匀的字节数(不是4的倍数),具体取决于源。 但是,如果你创build了input,并且是4的倍数是“有保证的”(或至less是一个先决条件),你可能不需要关心它。

为了进一步阐述缓冲点,考虑BufferedInputStream

 InputStream in = new BufferedInputStream(new FileInputStream(file), 1024); 

现在你有一个InputStream ,一次可以自动缓冲1024个字节,这样处理起来很麻烦。 这样,您可以一次愉快地读取4个字节,而不用担心太多的I / O。

其次,你也可以使用DataInputStream

 InputStream in = new DataInputStream(new BufferedInputStream( new FileInputStream(file), 1024)); byte b = in.readByte(); 

甚至:

 int i = in.readInt(); 

而不用担心构buildint s。

如果你已经在byte []数组中,你可以使用:

 int result = ByteBuffer.wrap(bytes).getInt(); 

来源: 这里

看看DataInputStream.readInt()是如何实现的;

  int ch1 = in.read(); int ch2 = in.read(); int ch3 = in.read(); int ch4 = in.read(); if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException(); return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); 

最简单的方法是:

 RandomAccessFile in = new RandomAccessFile("filename", "r"); int i = in.readInt(); 

– 要么 –

 DataInputStream in = new DataInputStream(new BufferedInputStream( new FileInputStream("filename"))); int i = in.readInt(); 

尝试这样的事情:

 a = buffer[3]; a = a*256 + buffer[2]; a = a*256 + buffer[1]; a = a*256 + buffer[0]; 

这是假设最低字节先来。 如果最高字节先出现,则可能需要交换索引(从0到3)。

基本上你要添加的每个字节,你首先乘以一个 256(这等于向左移8位),然后添加新的字节。

 for (int i = 0; i < buffer.length; i++) { a = (a << 8) | buffer[i]; if (i % 3 == 0) { //a is ready a = 0; } } 

您也可以使用BigInteger获取可变长度的字节。 您可以将其转换为Long,Integer或Short,以适合您的需求。

 new BigInteger(bytes).intValue(); 

或表示极性:

 new BigInteger(1, bytes).intValue();