左移无符号字节,更好的方法?

ste*_*veh 1 java bit-manipulation

我有一个字节数组(因为无符号字节不是一个选项),需要将其中的4个转换为32位int.我正在使用这个:

byte rdbuf[] = new byte[fileLen+1];
int i = (rdbuf[i++]) | ((rdbuf[i++]<<8)&0xff00) | ((rdbuf[i++]<<16)&0xff0000) | ((rdbuf[i++]<<24)&0xff000000);
Run Code Online (Sandbox Code Playgroud)

如果我不做所有的逻辑和,它标志扩展字节,这显然不是我想要的.

在c中,这将是一个没有脑子的人.Java中有更好的方法吗?

fge*_*fge 11

您不必这样做,您可以使用ByteBuffer:

int i = ByteBuffer.wrap(rdbuf).order(ByteOrder.LITTLE_ENDIAN).getInt();
Run Code Online (Sandbox Code Playgroud)

如果您有许多要读取的内容,则代码将变为:

ByteBuffer buf = ByteBuffer.wrap(rdbuf).order(ByteOrder.LITTLE_ENDIAN);

while (buf.remaining() >= 4) // at least four bytes
    i = bb.getInt();
Run Code Online (Sandbox Code Playgroud)

Javadoc 在这里.建议用于必须处理二进制数据的任何情况(无论您是读取还是写入此类数据).可以做小端,大端,甚至本地排序.(注意:默认为big endian).

(编辑:@PeterLawrey正确地提到这看起来像小端数据,固定代码提取 - 也,看看他如何将文件内容直接包装成a的答案ByteBuffer)

笔记:

  • ByteOrder有一个名为的静态方法.nativeOrder(),它返回底层架构使用的字节顺序;
  • a ByteBuffer有内置偏移量; 可以使用查询当前偏移量.position(),并使用.position(int); .remaining()将返回从当前偏移量开始读取的字节数,直到结束;
  • 有相对的方法可以读取/写入缓冲区的当前偏移量,以及绝对方法,它们将在您指定的偏移量处读取/写入.