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。
我在另一个问题上找到了一些有关如何将单个数组转换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;
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更有效的方法。
编辑:谢谢
标准库中已经存在一个类(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)