Java boolean []到byte []并返回

4 java arrays byte boolean bytearray

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

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

我想将此boolean[]数组转换byte[]为元素少8倍的数组,以便随后可以byte[]通过套接字发送该数组。

boolean[]阵列是这样的:01011010 10101010 01100011 11001010

byte[]这种情况下应该是这样的:0x5A 0xAA 0x63 0xCA

我在另一个问题上找到了一些有关如何将单个数组转换byteboolean[]数组的代码,并在此处添加了新方法以转换整个数组:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:谢谢

Dun*_*nes 5

标准库中已经存在一个类(BitSet)可帮助您完成此操作,您应该使用该类而不是布尔数组。该类允许您以一组的形式获取和设置位以及对布尔值进行各种逻辑运算。

例如。

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

如果您确实需要使用布尔数组,则下面的方法将起作用。

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这将忽略所有错误的布尔值。即:一个布尔数组都是假的,将得到一个空的字节数组。 (2认同)