2

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

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

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

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

这会将两个组合在一起(Laurence Gonsalves 在另一篇文章中发布)但我无法弄清楚将四个组合在一起的语法。

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

任何意见,将不胜感激。

谢谢。

托尼

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

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

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

再次感谢

4

4 回答 4

2

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

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

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

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

于 2011-01-20T16:25:54.530 回答
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 只是 Enums 专用的 Set 的有效实现。除了序列化之外,它没有 IO 功能。

于 2011-01-20T16:25:28.977 回答
0

EnumSet 是一组 Enum 元素。你大概是说BitSet

于 2011-01-20T16:26:33.247 回答
0

我不知道你在做什么的更大背景,但如果你控制数据结构,如果你需要 32 个标志,我怀疑创建一个 boolean[32] 数组会容易得多。

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

我并不是说永远不会有一个由一堆位标志组成的 int 然后被用来屏蔽数据流不是一个好主意,但我认为它很少是一个好主意。

于 2011-01-20T17:01:13.583 回答