Javascript JS-如何在二进制数据上计算MD5

Javascript JS-如何在二进制数据上计算MD5,javascript,utf-8,google-chrome-extension,binary,fileapi,Javascript,Utf 8,Google Chrome Extension,Binary,Fileapi,编辑:更改标题为“JS文件API-写入和读取UTF-8数据不一致”,以反映实际问题 我有一些二进制内容需要计算的MD5。内容是一个WARC文件,这意味着它包含文本和编码图像。为了避免文件保存中出现错误,我将所有数据转换并存储在arrayBuffers中。所有数据都放入UInt8Arrays中,以将其转换为UTF-8 为了进行测试,我的第一次尝试是使用saveAs库保存来自Chrome扩展名的文件。这意味着我使用了一个blob对象来传递给方法并创建文件 var b = new Blob(array

编辑:更改标题为“JS文件API-写入和读取UTF-8数据不一致”,以反映实际问题

我有一些二进制内容需要计算的MD5。内容是一个WARC文件,这意味着它包含文本和编码图像。为了避免文件保存中出现错误,我将所有数据转换并存储在arrayBuffers中。所有数据都放入
UInt8Array
s中,以将其转换为UTF-8

为了进行测试,我的第一次尝试是使用
saveAs
库保存来自Chrome扩展名的文件。这意味着我使用了一个blob对象来传递给方法并创建文件

var b = new Blob(arrayBuffers, {type: "text/plain;charset=utf-8"});
saveAs(b,'name.warc');
我还没有找到从
Blob
对象计算MD5的工具,所以我所做的是使用
FileReader
将Blob文件作为二进制数据读取,然后使用MD5工具(我使用cryptoJS以及faultylabs中的工具)计算结果

f = new FileReader();
f.readAsBinaryString(b);
f.onloadend = function(a){
    console.log( 'Original file checksum: ', faultylabs.MD5(this.result) );
}
这些资源(图像)是以
arraybuffer
格式直接下载的,因此我不需要转换它们

结果是错误的,这意味着从代码中检查MD5和从我保存在本地机器上的文件中检查MD5会得到两种不同的结果。作为文本阅读,显然会出现错误

我发现的解决方法是使用文件系统API在磁盘上写入blob对象,然后将其作为二进制数据读回,计算MD5,然后将检索到的文件保存为WARC文件(不是直接的blob对象,而是文件的“刷新”版本)。 在这种情况下,计算出的MD5很好(我在“刷新”版本的warc文件上计算),但当我启动带有“刷新”warc存档的warc replay实例时,它会抛出错误-而对于原始文件,我没有任何问题(但MD5不正确)


谁能解释一下为什么会有这种差异?在将我正在处理的所有对象作为二进制数据(存储、读取)处理时,我缺少了什么

基本上,我尝试了另一种方法,将blob文件转换回arraybuffer,并在此基础上计算MD5。此时,文件的MD5和arraybuffer是相同的

var b = new Blob(arrayBuffers, {type: "text/plain;charset=utf-8"});
            var blobHtml = new Blob( [str2ab(o_request.main_page_html)], {type: "text/plain;charset=utf-8"} );

f = new FileReader();
f.readAsArrayBuffer(b);
f.onloadend = function(a){
  var warcMD5 = faultylabs.MD5(this.result);
  var fd = new FormData();
  fd.append('warc_file', b)
  fd.append('warc_checksum_md5', warcMD5.toLowerCase());

  uploadData(fd);
}

我猜二进制字符串和缓冲区数组的结果是不同的,这就是MD5不一致的原因。

如果你投反对票,至少解释一下背后的原因。
var b = new Blob(arrayBuffers, {type: "text/plain;charset=utf-8"});
            var blobHtml = new Blob( [str2ab(o_request.main_page_html)], {type: "text/plain;charset=utf-8"} );

f = new FileReader();
f.readAsArrayBuffer(b);
f.onloadend = function(a){
  var warcMD5 = faultylabs.MD5(this.result);
  var fd = new FormData();
  fd.append('warc_file', b)
  fd.append('warc_checksum_md5', warcMD5.toLowerCase());

  uploadData(fd);
}