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

4

我有一些十六进制数值,需要将它们转换为二进制数据后才能写入文件。

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

// bytes contains the integers
str = String.fromCharCode.apply(String, bytes);

现在我创建了Blob文件并下载它:
var blob = new Blob([str], {type: "application/octet-stream"});
saveAs(blob, "file.bin");

但是出了一些问题:如果我打印bytesstr的长度,我得到相同的值(512),但文件包含了684个字符,这当然不是我所期望的结果。
因此,我有: 512对十六进制值 -> 512个整数 -> 512个字符 -> 我保存文件 -> 文件中有684个字符。
我做错了什么?我甚至尝试将字符集添加到blob文件中,例如:
var blob = new Blob([str], {type: "application/octet-stream;charset=UTF-8,"});

但是一直没有成功。

编辑:

原始十六进制:

Original HEX

已保存的文件:

Saved file


1
我将十六进制字符串转换为整数数组 - 这个未显示的“代码”部分很可能是你犯了一两个错误的地方。 - Jaromanda X
1
我误解了哪个数字代表什么,哪些是正确的,哪些是错误的 - 抱歉。 - Jaromanda X
没问题,Jaromanda X! - rvandoni
2
@rikpg,你能打开文件并使用十六进制工具比较内容吗?这可能会给你一些线索。 - Andrey
1
@rikpg 解释了所有。你正在把二进制文件写成文本格式。这会将字节转换成UTF8编码的字符。在Latin1编码中C0对应的是UTF8编码的C3 80。请使用二进制模式保存文件。 - Andrey
显示剩余5条评论
1个回答

7

感谢 Andrey,我找到了解决方案:

我需要以二进制模式编写,因此:

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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接