解释我想要达到的目标:
我得到一个文件,我必须从文件中读取数据并创建大小为 1 kb 的块。例如:如果文件大小为 5.8 kb,那么我将有 5 个 1 kb 的块和 1 个 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), 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);