
本文旨在解决 JavaScript 中将十六进制字符串反转为字节数组时,由于字符编码问题导致数据损坏的问题。特别是,当十六进制字符串包含表示非 ASCII 字符(如重音字符)的值时,传统的 String.fromCharCode() 方法可能会产生不正确的结果。以下将介绍一种使用 Uint8Array 的替代方法,该方法可以避免这些问题,并确保正确地重建原始数据。
在某些情况下,我们需要将二进制数据(例如 Excel 文件)从 Python 发送到 JavaScript。一种常见的方法是在 Python 中将数据十六进制化,然后将十六进制字符串发送到 JavaScript。在 JavaScript 端,我们需要将十六进制字符串转换回字节数组,以便创建 Blob 对象。
使用 String.fromCharCode() 方法进行转换可能会导致问题。例如,十六进制值 "c8" 会被转换为 "È",而不是预期的 "\xc8"。这会导致数据损坏,因为重建的文件与原始文件不匹配。
为了解决这个问题,我们可以使用 Uint8Array 来创建字节数组,而不是使用 String.fromCharCode()。Uint8Array 是一种类型化的数组,它表示 8 位无符号整数的数组。
立即学习“Java免费学习笔记(深入)”;
以下代码演示了如何使用 Uint8Array 将十六进制字符串转换为字节数组:
function unhexlify(hex) {
// 使用正则表达式匹配每两个十六进制字符
const matches = hex.match(/[\da-f]{2}/gi);
// 如果没有匹配项,则返回一个空数组
if (!matches) {
return new Uint8Array(0);
}
// 将匹配的十六进制字符转换为整数,并创建 Uint8Array
const typedArray = new Uint8Array(matches.map(h => parseInt(h, 16)));
return typedArray;
}
// 示例用法
const hexString = "c8";
const byteArray = unhexlify(hexString);
console.log(byteArray); // 输出: Uint8Array(1) [ 200 ]代码解释:
创建 Blob 对象:
一旦我们有了 Uint8Array,我们就可以使用它来创建一个 Blob 对象:
const blob = new Blob([byteArray], { type: "application/octet-stream" });此代码创建一个新的 Blob 对象,其中包含 byteArray 中的数据,并将 MIME 类型设置为 application/octet-stream。
使用 Uint8Array 可以避免在使用 String.fromCharCode() 将十六进制字符串转换为字节数组时可能出现的字符编码问题。这种方法确保了数据的完整性,并允许我们正确地重建原始数据,即使十六进制字符串包含表示非 ASCII 字符的值。
注意事项:
以上就是JavaScript 中正确反十六进制化包含重音字符的字符串的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号