为了账号安全,请及时绑定邮箱和手机立即绑定

将4个字节转换为int

将4个字节转换为int

慕雪6442864 2019-12-26 09:16:40
我正在读取这样的二进制文件: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 0000000100000000 00000000 00000000 00000010整数表示应该是1,2对吧?:-/前32位为1,其余32位为2。11111111 11111111 11111111 11111111将为-1和01111111 11111111 11111111 11111111将会 Integer.MAX_VALUE ( 2147483647 )
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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


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


查看完整回答
反对 回复 2019-12-26
?
紫衣仙女

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。


查看完整回答
反对 回复 2019-12-26
  • 3 回答
  • 0 关注
  • 1343 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信