如何解决对于 txt 以外的文件,MD5 校验和计算不正确?
我在上传之前使用 crypto-js 来计算我的文件的 MD5 校验和,下面是我的代码。
select t1.*
from table1 t1
order by (select t2.name_sort_order
from table2 t2
where t2.filterval = t.name and t2.name_sort_order is not null
),(select t2.job_sort_order
from table2 t2
where t2.filterval = t.job and t2.job_sort_order is not null
);
以上代码仅适用于文本文件,但在使用非文本文件文件图像、视频等时,校验和为计算错误。
感谢任何帮助/输入。 谢谢!
解决方法
只需将 .then((res) => res.blob())
的结果直接输入 MD5
函数即可。
编码为 text()
可能是有损的(和/或使用替换字符),并且 Latin1
也没有涵盖所有可能的字节值 - 至少正式如此。也不需要先转换为文本然后再转换回二进制。
需要转换为 CryptoJS 可以接受的二进制表示 - 如实现 in the other answer。然而,这需要是二进制到二进制的转换,而不是二进制 -> 文本 -> 二进制转换。
,Response.text()
读取响应流并使用 UTF-8 编码将其转换为字符串。不符合 UTF-8 的任意二进制数据将在此过程中被破坏(例如图像、视频等),s。还有另一个答案。
这可以通过使用 Response.arrayBuffer()
来防止,它只是将未更改的数据存储在 ArrayBuffer
中。
由于 CryptoJS 在内部使用 WordArray
,因此需要将 ArrayBuffer
进一步转换为 WordArray
。
以下修复适用于我的机器:
(async () => {
const getMd5 = async(fileObject) => {
let md5 = "";
try {
const fileObjectUrl = URL.createObjectURL(blob);
const blobText = await fetch(fileObjectUrl)
.then((res) => res.blob())
.then((res) => new Response(res).arrayBuffer()); // Convert to ArrayBuffer
const hash = CryptoJS.MD5(CryptoJS.lib.WordArray.create(blobText)); // Import as WordArray
md5 = hash.toString(CryptoJS.enc.Hex);
} catch (err) {
console.log("Error occured getMd5:",err);
}
return md5;
};
const blob = new Blob([new Uint8Array([0x01,0x02,0x03,0x7f,0x80,0x81,0xfd,0xfe,0xff])]);
console.log(await(getMd5(blob)));
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
为简单起见,我没有使用文件对象进行测试,而是使用不符合 UTF8 标准的数据的 blob 对象。 生成的哈希是正确的,可以在线验证,例如here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。