【发布时间】:2023-03-11 02:45:01
【问题描述】:
如何使用 javascript 将 UTF-8 字符串转换为 Latin1 编码的字符串?
这是我想要做的:
- 我得到一个文件,通过读取为 arraybuffer 将其分成块
- 然后,我将数组缓冲区解析为字符串
-
并使用以下代码将其传递给cryptoJS进行哈希计算:
cryptosha256 = CryptoJS.algo.SHA256.create(); cryptosha256.update(text); hash = cryptosha256.finalize();
这一切都适用于文本文件。使用代码对非文本文件(图像/.wmv 文件)进行哈希处理时遇到问题。我在另一个博客中看到,CryptoJS 作者要求使用 Latin1 格式而不是 UTF-8 发送字节,这就是我卡住的地方。
不确定,如何使用 javascript 中的 arraybuffer 的 Latin1 格式生成字节(或字符串)?
$('#btnHash').click(function () {
var fr = new FileReader(),
file = document.getElementById("fileName").files[0];
fr.onload = function (e) {
calcHash(e.target.result, file);
};
fr.readAsArrayBuffer(file);
});
function calcHash(dataArray, file) {
cryptosha256 = CryptoJS.algo.SHA256.create();
text = CryptoJS.enc.Latin1.parse(dataArray);
cryptosha256.update(text);
hash = cryptosha256.finalize();
}
【问题讨论】:
-
'bytes' 不是 Latin1 或任何其他格式。对于像(大多数)图像和声音这样的二进制文件,字符编码并不真正适用。如果您将文本从一种编码转换为另一种编码,您只会得到另一种编码的文本(可能会丢失一些字符)。如果您将二进制文件转换为另一种文本编码,您很可能会遇到损坏的文件。
-
我很确定 CryptoJS 确实直接采用了数组缓冲区。无需关心文本编码。
-
感谢 GolezTrol... 这是加密作者所写的:“当您将字符串传递给哈希器时,它会使用 UTF-8 转换为字节。这是为了确保不剪裁外来字符。因为您'正在处理二进制数据,您需要使用 Latin1 将字符串转换为字节。” sha256.update(CryptoJS.enc.Latin1.parse(evt.target.result));
-
当我尝试使用加密方法时 sha256.update(CryptoJS.enc.Latin1.parse(evt.target.result));它返回“未定义”作为哈希值:(
标签: javascript utf-8 character-encoding cryptojs latin1