我的要求是比较本地磁盘上文件的MD5哈希值和从数据库下载的文件。 该文件存储在SQL Server的VARBINARY(MAX)列中。该文件可以是任何类型。我目前正在测试PDF文件。我使用HttpPost请求从数据库中获取文件。 JSONObject是使用HttpResponse对象构建的。 JSONObject包含二进制格式的文件内容。
现在我必须将收到的二进制数据的MD5哈希值与磁盘上同一文件的MD5哈希值进行比较。我编写了以下代码,但MD5哈希值不匹配。 我想我只是简单地计算下载的二进制内容的MD5。有没有正确的方法来做到这一点?提前谢谢。
// Read response from a HttpResponse object 'response'
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line="";
StringBuilder sb = new StringBuilder();
while((line=reader.readLine())!=null) {
sb.append(line);
}
// construct jsonobject
JSONObject jsonResponse = new JSONObject(sb.toString());
//Read file from disk
FileInputStream fis = new FileInputStream(new File(this.getClass().getResource("C:\\demo.pdf").getPath()));
// Calculate MD5 of file read from disk
String md5Request = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis);
// Calculate MD5 of binary contents. "binfile" is name of key in the JSONObject
// and binary contents of downloaded file are in its corresponding value field
String md5Response = org.apache.commons.codec.digest.DigestUtils.md5Hex(jsonResponse.getString("binfile"));
Assert.assertEquals("Hash sums of request and response must match", md5Request, md5Response);
当我调试时,我在JSONObject'jsonResponse'
中看到了对binfile密钥的这个值binfile=[37,80,68,70,45,49,46,52,13,37,-30,-29,-49,-45,13,10,52,48...]
以下是一个冗长的二进制数据流。
答案 0 :(得分:1)
好的,在SQL中有一个内置函数,如下所示:
select *,
convert(varchar(50),master.sys.fn_repl_hash_binary(a.BinaryField),2) as 'MD5Hash'
from SomeTable a
您为fn_repl_hash_binary提供您正在读取的二进制字段的名称,加上“2”作为参数,告诉SQL将该值计算为MD5;我认为“1”是SHA。
在Java中,您可以使用以下内容:
private String getMD5Hash(byte[] bytes) throws java.lang.Exception{
String s="This is a test";
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(bytes,0,bytes.length);
return new BigInteger(1,m.digest()).toString(16);
}
这应该可以解决问题。祝你好运,CodeWarrior。
答案 1 :(得分:0)
这不是一个新帖子,但这是一个可能的解决方案,因为我在python上也遇到了这个问题并做了一堆测试以找到该怎么做...
在处理二进制中的所有数据时,需要打开文件以二进制模式进行比较。
我的原始代码每次都无法读取正确的MD5校验和:
with open(filepath, "r") as file_to_check:
tile_file = file_to_check.read()
更正后的代码:
with open(filepath, "rb") as file_to_check:
tile_file = file_to_check.read()
只需在read(r)标志之后添加b(二进制),让python知道它需要将文件读取为二进制文件,现在它可以正常工作。
这可能会帮助您找到问题...希望它有所帮助!