如何将List<Boolean>转换为byte[]数组?代码实现遇问题求助
问题排查与修正方案
我帮你梳理下代码里的核心问题,这几个点是导致转换异常的关键:
1. 最致命的遗漏:List到boolean[]的赋值
你创建了inputSleep数组,但完全没有把List<Boolean>里的元素复制进去!数组默认值是false,所以不管你的List里是什么值,最终转出来的byte[]全是0,这肯定不符合预期。必须补上赋值步骤:
List<Boolean> list = model.getBooleanData(); boolean[] inputSleep = new boolean[list.size()]; // 补上这一段:把List中的元素复制到boolean数组 for (int i = 0; i < list.size(); i++) { // 用Boolean.TRUE.equals避免NullPointerException(如果List里有null元素) inputSleep[i] = Boolean.TRUE.equals(list.get(i)); }
2. 可能的位序逻辑不符合预期
你当前用128 >> bit来设置位,这意味着List里的第一个boolean对应byte的最高位(第7位),如果你的需求是让第一个boolean对应byte的最低位(第0位),逻辑就反了。可以根据需求二选一:
- 保持高位优先(原逻辑):
currentByte |= (128 >> bit); - 改为低位优先:
currentByte |= (1 << bit);
3. 未处理List长度不是8的倍数的情况
如果你的List长度不是8的整数倍,当前代码会直接忽略最后几个不足8个的boolean(因为toReturn.length = inputSleep.length / 8是整数除法)。要保留所有元素的话,需要向上取整计算byte数组的长度:
// 向上取整,比如9个boolean需要2个byte int byteLength = (inputSleep.length + 7) / 8; byte[] toReturn = new byte[byteLength];
完整修正后的代码
结合上面的所有优化,最终代码如下:
List<Boolean> list = model.getBooleanData(); boolean[] inputSleep = new boolean[list.size()]; // 复制List元素到boolean数组,处理null情况 for (int i = 0; i < list.size(); i++) { inputSleep[i] = Boolean.TRUE.equals(list.get(i)); } // 计算需要的byte数组长度(向上取整) int byteLength = (inputSleep.length + 7) / 8; byte[] toReturn = new byte[byteLength]; for (int entry = 0; entry < byteLength; entry++) { byte currentByte = 0; for (int bit = 0; bit < 8; bit++) { int index = entry * 8 + bit; if (index >= inputSleep.length) { break; // 超出List长度,停止当前byte的处理 } if (inputSleep[index]) { // 这里根据你的位序需求二选一: // 高位优先(原逻辑): currentByte |= (128 >> bit); // 低位优先: // currentByte |= (1 << bit); } } toReturn[entry] = currentByte; }
内容的提问来源于stack exchange,提问作者TsigumEnes
相关产品推荐
相关产品推荐

