私が達成しようとしていることの説明:
ファイルが与えられ、ファイルからデータを読み取り、サイズが 1 kb のブロックを作成する必要があります。例: ファイル サイズが 5.8 kb の場合、それぞれ 1 kb の 5 つのブロックと 0.8 kb の最後の 1 つのブロックがあります。これらをブロックに含めた後、最後のブロックから SHA 256 エンコーディングを実行し、最後から 2 番目のブロックに追加する必要があります。その後、エンコーディングを最後から 2 番目のブロックに適用し、最後から 3 番目のブロックに追加する必要があります。
問題
ファイル サイズが 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);