微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用来自 ByteBuffer 的消息摘要计算校验和

如何解决使用来自 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 举报,一经查实,本站将立刻删除。