如何解决使用来自 ByteBuffer 的消息摘要计算校验和
我以32KB的byte buffer形式获取数据,想计算整个数据的校验和。因此,使用 MessageDigest
我不断将字节更新到其中,最后我使用摘要方法计算读取的字节并从中计算校验和。上述方法计算的校验和是错误的。下面是代码。知道如何做对吗?
private MessageDigest messageDigest;
//Keep getting bytebuffer of 32kb till eof is read
public int write(ByteBuffer src) throws IOException {
try {
ByteBuffer copiedByteBUffer = src.duplicate();
try{
messageDigest = MessageDigest.getInstance(MD5_CHECKSUM);
while(copiedByteBUffer.hasRemaining()){
messageDigest.update(copiedByteBUffer.get());
}
}catch(Exception e){
throw new IOException(e);
}
copiedByteBUffer = null;
}catch(Exception e){
}
}
//called after whole file is read in write function
public void calculateDigest(){
if(messageDigest != null){
byte[] digest = messageDigest.digest();
checkSummultipartfile = toHex(digest); // converting bytes into hexadecimal
}
}
更新尝试 #2
//Will Keep getting bytebuffer of 32kb till eof is read
public int write(ByteBuffer original) throws IOException {
try {
ByteBuffer copiedByteBuffer = cloneByteBuffer(original);
messageDigest = MessageDigest.getInstance(MD5_CHECKSUM);
messageDigest.update(copiedByteBuffer);
copiedByteBUffer = null;
}catch(Exception e){
}
}
public static ByteBuffer cloneByteBuffer(ByteBuffer original) {
final ByteBuffer clone = (original.isDirect()) ? ByteBuffer.allocateDirect(original.capacity()):ByteBuffer.allocate(original.capacity());
final ByteBuffer readOnlycopy = original.asReadOnlyBuffer();
readOnlycopy.flip();
clone.put(readOnlycopy);
clone.position(original.position());
clone.limit(original.limit());
clone.order(original.order());
return clone;
}
在尝试上面的代码后,我能够看到消息摘要正在使用读取的所有字节进行更新,例如:如果文件大小为 52,42,892 字节,则它已更新为 52,892 字节。但是当使用CMD的certutil -hashfile MD5
计算的文件校验和和上面的方法计算的不匹配时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。