Java将4个字节转换为int

时间:2010-05-15 13:03:28

标签: java casting packing

我想知道这个记录的here的解决方案是否仍然是解决方案,还是有其他方式从4个字节获取int?

谢谢。

编辑:我从套接字.read

获取byte []

编辑:int recvMsgSize = in.read(Data, 0, BufferSize);如果recvMsgSize为-1,我知道连接已被删除。

我在使用DataInputStream而不是InputStream时如何检测到这一点?

感谢。

编辑:对于接受正确答案的yoyo道歉。但是在mihi更新了最终回复之后,看起来该方法是可靠的并且减少了扩展编码,并且在我看来是最佳实践。

5 个答案:

答案 0 :(得分:17)

您必须非常谨慎地使用任何扩展转化和数字宣传,但下面的代码会将4 byte转换为int

    byte b1 = -1;
    byte b2 = -2;
    byte b3 = -3;
    byte b4 = -4;
    int i = ((0xFF & b1) << 24) | ((0xFF & b2) << 16) |
            ((0xFF & b3) << 8) | (0xFF & b4);
    System.out.println(Integer.toHexString(i)); // prints "fffefdfc"

另见

答案 1 :(得分:16)

如果您已将它们放在byte[]数组中,则可以使用:

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

或者,如果您的类路径中有Google的guava-libraries,则可以使用快捷方式:

int result = Ints.fromByteArray(array);

这样做的好处是,您可以为其他类型(Longs.fromByteArrayShorts.fromByteArray等提供类似的API。

答案 2 :(得分:8)

取决于您从哪里获得这4个字节:

http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html#readInt()

http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#getInt(int)

您当然可以手动执行此操作,但在大多数情况下使用其中一个(如果必须转换具有大量字节的字节数组,则可能需要在{{1}周围使用DataInputStream例如)更容易。

编辑:如果需要更改字节序,则必须使用ByteBuffer,或者自己反转字节,或者自己进行转换,因为DataInput不支持更改字节序。< / p>

Edit2 :当你从套接字输入流中获取它们时,我将它包装成ByteArrayInputStream并用它来读取所有类型的数据。特别是因为InputStream.read(byte [])不能保证填充整个字节数组... DataInputStream.readFully。

DataInputStream

Edit3 :从流中多次阅读时,他们会继续阅读您停止的位置,i。即aByte将是字节0,anInt将是字节1到4,anotherInt将是字节5到8,等等.readFully将在所有这些之后读取并将阻塞,直到它已经读取DataInputStream in = new DataInputStream(socket.getInputStream()); byte aByte = in.readByte(); int anInt = in.readInt(); int anotherInt = in.readInt(); short andAShort = in.readShort(); // 11 bytes read :-) byte[] lotOfBytes = new byte[anInt]; in.readFully(lotOfBytes);

当流停止(连接断开)时,你将获得lotOfbytes而不是-1,所以如果你得到-1,则int真的是-1。

如果您根本不想解析任何字节,可以跳过()它们。 DataInputStream无法以2种不同的方式解析一个字节(即首先从字节0到3读取一个int,然后从字节2到5读取一个),但通常也不需要。

示例:

EOFException

希望这能解答您的其他问题。

答案 3 :(得分:-1)

功能风格的解决方案(仅适用于各种各样,使用起来不太方便):

private int addByte (int base, byte appendix) {
    return (base << 4) + appendix;
}

public void test() {
    byte b1 = 5, b2 = 5, byte b3 = 0, b4 = 1;
    int result = addByte (addByte (addByte (addByte (0, b1), b2), b3), b4);
}

答案 4 :(得分:-3)

正如mihi所说,这取决于你从哪里得到这些字节,但这段代码可能有用:

int myNumber = (((int)byteOne) << 0) |
    (((int)byteTwo) << 8) |
    (((int)byteThree) << 16) |
    (((int)byteFour) << 24);