我正在发送byte[]
Java 中通过套接字连接的数组。
我有一个相当长的boolean[]
数组,其中array.length % 8 == 0
.
我想转换这个boolean[]
数组变成byte[]
数组的元素数量是原来的 8 倍,这样我就可以发送byte[]
通过套接字连接。
The boolean[]
数组看起来像这样:01011010 10101010 01100011 11001010
etc.
The byte[]
在这种情况下应该看起来像这样:0x5A 0xAA 0x63 0xCA
.
我在另一个关于如何转换单个的问题上找到了一些代码byte
into a 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 https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html)在标准库中可以帮助您做到这一点,您应该使用它而不是布尔数组。该类允许您获取和设置位以及对布尔值作为一组进行各种逻辑运算。
eg.
BitSet bits = BitSet.valueOf(bytes);
boolean third_bit = bits.get(3);
bits.set(5, false);
byte[] new_bytes = bits.toByteArray();
如果您确实需要使用布尔数组,那么以下内容将起作用。
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));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)