Java boolean[] 到 byte[] 并返回

标签 java arrays boolean byte bytearray

我在 Java 中通过套接字连接发送 byte[] 数组。

我有一个很长的 boolean[] 数组,其中 array.length % 8 == 0

我想将这个 boolean[] 数组转换为元素数量减少 8 倍的 byte[] 数组,这样我就可以发送 byte[] 通过套接字连接。

boolean[] 数组如下所示:01011010 10101010 01100011 11001010

本例中的 byte[] 应如下所示:0x5A 0xAA 0x63 0xCA

我在另一个关于如何将单个 byte 转换为 boolean[] 数组的问题上找到了一些代码,并向其添加了一个新方法来转换整个数组这里:

public static boolean[] booleanArrayFromByteArray(byte[] x) {
    boolean[] y = new boolean[x.length * 8];
    int position = 0;
    for(byte z : x) {
        boolean[] temp = booleanArrayFromByte(z);
        System.arraycopy(temp, 0, y, position, 8);
        position += 8;
    }
    return y;
}

public static boolean[] booleanArrayFromByte(byte x) {
    boolean bs[] = new boolean[4];
    bs[0] = ((x & 0x01) != 0);
    bs[1] = ((x & 0x02) != 0);
    bs[2] = ((x & 0x04) != 0);
    bs[3] = ((x & 0x08) != 0);
    return bs;
}

我想知道是否有更有效的方法。

编辑:谢谢

最佳答案

标准库中已经存在一个类 ( BitSet ) 来帮助您执行此操作,您应该使用它而不是 boolean 数组。该类允许您作为一个组获取和设置位以及对 boolean 值的各种逻辑操作。

例如。

BitSet bits = BitSet.valueOf(bytes); 
boolean third_bit = bits.get(3);
bits.set(5, false);
byte[] new_bytes = bits.toByteArray();

如果您真的需要使用 boolean 数组,那么下面的方法就可以了。

static boolean[] toBooleanArray(byte[] bytes) {
    BitSet bits = BitSet.valueOf(bytes);
    boolean[] bools = new boolean[bytes.length * 8];
    for (int i = bits.nextSetBit(0); i != -1; i = bits.nextSetBit(i+1)) {
        bools[i] = true;
    }
    return bools;
}

static byte[] toByteArray(boolean[] bools) {
    BitSet bits = new BitSet(bools.length);
    for (int i = 0; i < bools.length; i++) {
        if (bools[i]) {
            bits.set(i);
        }
    }

    byte[] bytes = bits.toByteArray();
    if (bytes.length * 8 >= bools.length) {
        return bytes;
    } else {
        return Arrays.copyOf(bytes, bools.length / 8 + (bools.length % 8 == 0 ? 0 : 1));
    }
}

关于Java boolean[] 到 byte[] 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26944282/

相关文章:

java - 如果最后一个 EJBBean 方法抛出 SystemException,EJB 容器是否会删除调用层次结构中的所有 EJB 对象?

php - 如何在mysql select查询中传递数组值

java - 我如何在 Java 中返回 boolean 值?

java - 如何使用javafx设置图像

java - Junit - 模拟一个文件

java - Box2d夹具位置

java - 错误 - java 中的 "array required, but LinkedList<LLObj> found"

javascript - 如何循环遍历对象数组以查找包含相同单词的键值-Javascript

java - boolean 值无法正确更新,除非您打印它

objective-c - 在应用程序启动时设置带有复选框的 BOOL 值?