java – Arrays的Arraylist,如何使最后一个数组大小与列表中的其
发布时间:2020-12-15 04:09:48 所属栏目:Java 来源:网络整理
导读:解释我想要实现的目标: 我得到一个文件,我必须从文件中读取数据并创建大小为1 kb的块.例如:如果文件大小为5.8 kb,那么我将有5个块,每个1 kb,最后一个块为0.8 kb.在块中具有这些之后,我必须从最后一个块执行SHA 256编码并将其附加到倒数第二个块,之后我必须
解释我想要实现的目标:
我得到一个文件,我必须从文件中读取数据并创建大小为1 kb的块.例如:如果文件大小为5.8 kb,那么我将有5个块,每个1 kb,最后一个块为0.8 kb.在块中具有这些之后,我必须从最后一个块执行SHA 256编码并将其附加到倒数第二个块,之后我必须将编码应用于倒数第二个块并将其附加到第三个块,依此类推. 问题 如果我给了1024字节文件大小的多个,那么我的代码运行良好.但如果我的最后一个块大小不是1024,则代码??不能按预期工作. 我现在这样做的方式是: BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); int sizeOfBlock = 1024; int sizeOfHash = 256; MessageDigest md; md = MessageDigest.getInstance("SHA-256"); byte[] block = new byte[sizeOfBlock]; List <byte []> blockList = new ArrayList <byte []>(); int tmp = 0; while ((tmp = bis.read(block)) > 0) { System.out.println(tmp); blockList.add(block); } for (int j = blockList.size()-1; j > 0;){ System.out.println(blockList.get(j).length); // for the first iteration it shouldnt be 1024 if the file size is not a multiple of 1024 md.update(blockList.get(j--)); byte[] hash = md.digest(); byte[] appendBlock = new byte[blockList.get(j).length + hash.length]; System.arraycopy(blockList.get(j),appendBlock,blockList.get(j).length); System.arraycopy(md.digest(),blockList.get(j).length,hash.length); blockList.set(j,appendBlock); } System.out.println(blockList.get(0).length); md.update(blockList.get(0)); byte[] hash = md.digest(); String result = bytesToHex(hash); // converting function from byte to hex System.out.println(result); 解决方法
您似乎是一次又一次地将相同的1024字节数组添加到数组列表中.
所以当然所有的数组都是1024字节.它们是相同的阵列. 此外,每次调用read时都会覆盖块数组,因此它将包含从文件中读取的最后一个块. 您应该在数组列表中存储该数组的副本. 你应该做的事情如下: while ((tmp = bis.read(block)) > 0) { byte[] currentBlock = new byte[tmp]; System.arraycopy (block,currentBlock,tmp); System.out.println(tmp); blockList.add(currentBlock); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |