Java四字节到二进制'bitmask'

时间:2011-01-20 16:20:54

标签: java binary masking

我正在尝试从二进制文件中取四个字节并将它们转换为一个位掩码,表示数据为零,元数据为1。

我假设我需要将它们转换成一个int或者将它们组合在一起,然后通过它进行位移以确定是否设置了位位置。

我无法弄清楚如何将所有四个组合在一起以获得一个我可以步进的32位掩码。

int mask = (((int)hbyte) & 0xff) << 8 | (((int)lbyte) & 0xff);

这将两个结合在一起(来自另一篇文章的Laurence Gonsalves发表)但我无法弄清楚将四个结合在一起的语法。

或者这是Enumset的情况,我承认我并不完全理解。

任何建议都将受到赞赏。

感谢。

**只是为此添加另一个快速注释,(我不确定这是否通常允许,所以我提前道歉,如果不是),通过我新创建的int并检查是否是一个最好的方法是什么是否设置了位?

目前我正在使用if (((comboOfBytes >> bitmaskBit) & 1) == 0),但我不知道这是否是我所需要的最优雅的检查方式。

此外,我还不完全确定我是否理解移位实际上是如何允许检查所有32位的!

再次感谢

4 个答案:

答案 0 :(得分:2)

您可以使用DataInputStream从文件中读取4个字节作为int。

或者,如果您读取字节a,b,c,d:

int comboOfBytes = ((a & 0xff) << 24) | ((b & 0xff) << 16) | ((c & 0xff) << 8) | (d & 0xff);

(&amp; 0xff)是防止符号位扩展破坏更高字节所必需的。

答案 1 :(得分:1)

我总是使用以下

public static int compose(byte x3, byte x2, byte x1, byte x0) {
    return (x3 << 24)
            + ((x2 & 0xFF) << 16)
            + ((x1 & 0xFF) << 8)
            + ((x0  & 0xFF) << 0);
}

但是,您可能希望使用DataStream。

不,EnumSet不是要走的路。 EnumSet只是Set专用于枚举的高效实现。除了序列化之外,它没有IO功能。

答案 2 :(得分:0)

EnumSet是一组枚举元素。你可能意味着BitSet

答案 3 :(得分:0)

我不知道你要做的更大的上下文,但如果你控制数据结构,如果你需要32个标志,我怀疑创建一个布尔值会容易得多[32]阵列。

是的,位标志可以节省内存,但除非你拥有数百万,否则这可能并不重要。

我不是说从来没有时间由一堆位标志组成然后用于屏蔽数据流的int不是一个好主意,但我认为这不是一个好主意。