加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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);           
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读