使用来自 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 字节。但是当使用CMDcertutil -hashfile MD5计算的文件校验和和上面的方法计算的不匹配时。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...