3 回答
TA贡献1911条经验 获得超7个赞
如果您已经将它们放置在byte []数组中,则可以使用:
int result = ByteBuffer.wrap(bytes).getInt();
TA贡献1839条经验 获得超15个赞
您应该将其放入这样的函数中:
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
这样可以避免用完字节并正确处理负字节值。
我不知道执行此操作的标准功能。
要考虑的问题:
字节序:不同的CPU架构按不同的顺序放置构成int的字节。根据开始时字节数组的方式,您可能会为此担心。和
缓冲:如果您一次抓取1024个字节并在元素1022处开始一个序列,则在获得4个字节之前将到达缓冲区的末尾。最好使用某种形式的缓冲输入流来自动进行缓冲,这样您就可以readByte()重复使用而不必担心。
尾随缓冲区:输入的末尾可能是字节数不均(具体来说不是4的倍数),具体取决于源。但是,如果您创建的输入开头是“保证”(或至少是前提条件)的4的倍数,则可能无需担心。
为了进一步详细说明缓冲点,请考虑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();
完全不用担心构造int。
添加回答
举报