我在 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/