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(),它返回底层架构使用的字节顺序;ByteBuffer有内置偏移量; 可以使用查询当前偏移量.position(),并使用.position(int); .remaining()将返回从当前偏移量开始读取的字节数,直到结束;