我正在尝试从二进制文件中取四个字节并将它们转换为一个位掩码,表示数据为零,元数据为1。
我假设我需要将它们转换成一个int或者将它们组合在一起,然后通过它进行位移以确定是否设置了位位置。
我无法弄清楚如何将所有四个组合在一起以获得一个我可以步进的32位掩码。
int mask = (((int)hbyte) & 0xff) << 8 | (((int)lbyte) & 0xff);
这将两个结合在一起(来自另一篇文章的Laurence Gonsalves发表)但我无法弄清楚将四个结合在一起的语法。
或者这是Enumset的情况,我承认我并不完全理解。
任何建议都将受到赞赏。
感谢。
贝
**只是为此添加另一个快速注释,(我不确定这是否通常允许,所以我提前道歉,如果不是),通过我新创建的int并检查是否是一个最好的方法是什么是否设置了位?
目前我正在使用if (((comboOfBytes >> bitmaskBit) & 1) == 0)
,但我不知道这是否是我所需要的最优雅的检查方式。
此外,我还不完全确定我是否理解移位实际上是如何允许检查所有32位的!
再次感谢
答案 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不是一个好主意,但我认为这不是一个好主意。