java - 数组的数组列表,如何使最后一个数组的大小与列表中的其他数组有所不同

标签 java arrays arraylist

解释我想要达到的目标:

我有一个文件,我必须从文件中读取数据并创建大小为 1 kb 的 block 。例如:如果文件大小为 5.8 kb,那么我将有 5 个 block ,每个 block 为 1 kb,最后一个 block 为 0.8 kb。在 block 中包含这些之后,我必须从最后一个 block 开始进行 SHA 256 编码并将其附加到倒数第二个 block ,之后我必须将编码应用于倒数第二个 block 并将其附加到倒数第三个,依此类推。

问题

如果给我的文件大小是 1024 字节的倍数,那么我的代码运行良好。但是,如果我的最后一个 block 大小不是 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), 0, appendBlock, 0, blockList.get(j).length);
    System.arraycopy(md.digest(), 0, appendBlock, 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 时都会覆盖 block 数组,因此它将包含您从文件中读取的最后一个 block 。 您应该将数组的副本存储在数组列表中。

你应该这样做:

while ((tmp = bis.read(block)) > 0) {
    byte[] currentBlock = new byte[tmp];
    System.arraycopy (block, 0, currentBlock, 0, tmp);
    System.out.println(tmp);
    blockList.add(currentBlock);           
} 

关于java - 数组的数组列表,如何使最后一个数组的大小与列表中的其他数组有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375808/

相关文章:

java - 使用 ArrayList<HashMap> 中的数据加载 JTable

java - 如何访问数组列表中对象的一部分?

java - 依赖注入(inject)和多个实例

Python - 对数组进行排序以在其中进行搜索的最有效方法

arrays - 没有malloc的动态数组?

javascript - 是否可以通过 JavaScript 将数组提交到 AJAX?

Java - 如何从句子的ArrayList中获取每个单词

java - 当我通过日期选择器和时间选择器选择日期和时间时,如何将日期和时间存储在 SQLite 数据库中?

java - List<Object> 和 List 之间的区别

java - 为什么这只会生成一个随机字符串? [Java]