Javascript:如何将十六进制数据转换为二进制数据并将其写入文件

Javascript:如何将十六进制数据转换为二进制数据并将其写入文件,javascript,binary,hex,blob,Javascript,Binary,Hex,Blob,我有一堆十六进制值,在将它们写入文件之前,我必须将其转换为二进制数据 我将十六进制字符串转换为整数数组,然后将每个整数转换为字符: // bytes contains the integers str = String.fromCharCode.apply(String, bytes); 现在,我创建blob文件并下载它: var blob = new Blob([str], {type: "application/octet-stream"}); saveAs(blob, "file.bin

我有一堆十六进制值,在将它们写入文件之前,我必须将其转换为二进制数据

我将十六进制字符串转换为整数数组,然后将每个整数转换为字符:

// bytes contains the integers
str = String.fromCharCode.apply(String, bytes);
现在,我创建blob文件并下载它:

var blob = new Blob([str], {type: "application/octet-stream"});
saveAs(blob, "file.bin");
但是出现了一些问题:如果我打印
字节的
长度
str的长度
我有相同的值(
512
),但是文件包含684个字符,当然这不是我所期望的

因此,我:

512十六进制值对-> 512整数-> 512字符-> 我保存文件-> 684文件中的字符

我做错了什么?我甚至尝试将字符集添加到blob文件中,即:

var blob = new Blob([str], {type: "application/octet-stream;charset=UTF-8,"});
但是没有成功

编辑:

原始十六进制:

保存的文件:


多亏了安德烈,我找到了解决方案:

我必须以二进制模式写入,因此:

var ab = new ArrayBuffer(bytes.length); //bytes is the array with the integer
var ia = new Uint8Array(ab);

for (var i = 0; i < bytes.length; i++) {
  ia[i] = bytes[i];
}

var blob = new Blob([ia], {type: "application/octet-stream"});
saveAs(blob, id + "_<?php echo $report['md5']; ?>.bin");
var ab=new ArrayBuffer(bytes.length)//bytes是包含整数的数组
var ia=新的UINT8阵列(ab);
对于(变量i=0;i
我将十六进制字符串转换为整数数组
-这段未显示的“代码”是您最有可能犯一两个错误的地方。我不这么认为,如果我将str打印到控制台中,我可以看到正确的值。顺便说一下,我将修改我的问题,添加该部分也!我误解了哪个数字意味着什么,哪些是正确的,哪些是错误的-sorry@rikpg你们能打开文件,把内容和你们的十六进制文件比较一下吗?这可能会给你一个线索。@rikpg这就解释了一切。您正在以文本形式编写二进制文件。它将字节转换为UTF8中的字符。拉丁文1中的C0是UTF8中的C3 80。使用二进制模式保存文件。