我想知道这个记录的here的解决方案是否仍然是解决方案,还是有其他方式从4个字节获取int?
谢谢。编辑:我从套接字.read
获取byte []编辑:int recvMsgSize = in.read(Data, 0, BufferSize);
如果recvMsgSize为-1,我知道连接已被删除。
我在使用DataInputStream而不是InputStream时如何检测到这一点?
感谢。
编辑:对于接受正确答案的yoyo道歉。但是在mihi更新了最终回复之后,看起来该方法是可靠的并且减少了扩展编码,并且在我看来是最佳实践。
答案 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"
& 0xFF
进行屏蔽 - 如果您使用byte
,您可能最终会做很多事情,因为所有算术操作都会提升为int
}(或long
)答案 1 :(得分:16)
如果您已将它们放在byte[]
数组中,则可以使用:
int result = ByteBuffer.wrap(bytes).getInt();
或者,如果您的类路径中有Google的guava-libraries,则可以使用快捷方式:
int result = Ints.fromByteArray(array);
这样做的好处是,您可以为其他类型(Longs.fromByteArray
,Shorts.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);