def bitsarr_to_bytearr(bitsarr): bytes_list = [sum([list(byte)[::-1][b] << b for b in range(0,8)]) #高低位交换 for byte in zip(*(iter(bitsarr),) * 8)] return bytearray(bytes_list) 是什么意思
时间: 2024-03-31 18:34:25 浏览: 63
这段代码是将一个由0和1组成的二进制位数组转换为字节数组(bytearray)。具体实现过程如下:
1. 首先,将二进制位数组按照8个一组进行分组,每组8个二进制位,即一个字节(byte)的大小。这可以通过zip函数和iter函数实现。zip函数可以将多个可迭代对象按照对应位置进行组合,而iter函数可以将一个可迭代对象转换为迭代器。其中,*(iter(bitsarr),) * 8表示将bitsarr转换为迭代器,然后重复8次,相当于每次从bitsarr中取出8个元素进行组合。
2. 对于每个字节,将其按照高低位交换的方式转换为十进制数。具体做法是,对于每个二进制位(从低位到高位),将其左移位数(0~7)个位置,然后相加得到该字节对应的十进制数。这可以通过列表解析式和sum函数实现。
3. 将每个字节对应的十进制数组成的列表转换为字节数组,即bytearray类型,然后返回。
总之,这段代码是将位数组转换为字节数组的通用实现方式,可以在网络传输、文件存储等场景中使用。
相关问题
def bitsarr_to_bytearr(bitsarr): bytes_list = [sum([list(byte)[::-1][b] << b for b in range(0,8)]) for byte in zip(*(iter(bitsarr),) * 8)] return bytearray(bytes_list) 是什么意思
这段代码的作用是将一个由0和1组成的二进制位数组转换为字节数组(bytearray),具体的实现步骤如下:
1. 首先通过`zip(*(iter(bitsarr),) * 8)`,将bitsarr按照8个一组进行分组,每组8个二进制位,即一个字节的大小,得到一个元组列表。
2. 对于每个字节,利用列表推导式和sum函数,将其按照高低位交换的方式转换为十进制数。具体实现是,对于每个二进制位(从低位到高位),将其左移位数(0~7)个位置,然后相加得到该字节对应的十进制数。
3. 将每个字节对应的十进制数组成的列表转换为字节数组,即bytearray类型,并返回结果。
总之,这段代码的作用是将位数组转换为字节数组的通用实现方式,可以在网络传输、文件存储等场景中使用。
解释代码 public static void writeDataFromList(String address, ArrayList<BigInteger> toWrite) throws IOException { ArrayList<Byte[]> data = new ArrayList<>(); for(BigInteger bi : toWrite) { byte[] byteArr = bi.toByteArray(); Byte[] ByteArr = new Byte[byteArr.length]; for(int i = 0; i < byteArr.length; i++) ByteArr[i] = byteArr[i]; data.add(ByteArr); } int lastElLen = 0; for(lastElLen = 0; lastElLen < data.get(data.size()-1).length; lastElLen++) { if (data.get(data.size()-1)[lastElLen] == 0) { break; } } byte[] combinedArr = new byte[((data.size()-1) * data.get(0).length) + lastElLen]; int j = 0; for(Byte[] arr : data) { for (Byte arrEl : arr) { combinedArr[j] = arrEl; j++; if (j == combinedArr.length) break; } } System.out.println("dec bytedata:"+ Base64.getEncoder().encodeToString(combinedArr)); BigInteger combined = new BigInteger(combinedArr); writeData(address, combined); }
这段代码是一个方法,它的作用是将一个包含多个 BigInteger 对象的 ArrayList 写入到指定地址的文件中。具体实现过程如下:
1. 首先将每个 BigInteger 对象转换成一个 byte 数组,然后将 byte 数组转换成 Byte 类型的数组,并将它们添加到一个 ArrayList 中。
2. 接着,遍历 ArrayList 中最后一个元素的 Byte 数组,找到最后一个非零字节的位置,以便在后面的步骤中可以正确地重构原始 BigInteger 对象。
3. 然后创建一个新的 byte 数组,将 ArrayList 中所有 Byte 数组按顺序拼接到一起,组成一个新的 byte 数组。
4. 最后,将新的 byte 数组转换成一个 BigInteger 对象,并将其写入到指定地址的文件中。
这个方法中用到了一些 Java 的基本数据类型和集合类,包括 ArrayList、byte[] 和 BigInteger,以及一些数组和循环操作。在这个方法中还输出了一个 Base64 编码后的字符串,用于检查生成的 byte 数组是否正确。
阅读全文