一次项目中,为了图省事儿,我想用js做网页脚本,来实现一些自动化操作。无非就是读取文件,摘取有用信息,转换成十六进制bin保存。
然而在保存成bin的过程中出现了问题,详细是怎样的问题呢,可以参考这位博主的问题:https://ask.csdn.net/questions/765886
出现这样的问题的原因其实很简单。将十六进制转换成字符串的方法,在网上大多使用的方法是 String.fromCharCode ,这个方法会把一个数字码转换为字符。而我们在保存文件的时候,同样也是用转换得到的字符串保存的。这就引入了一个问题:通常UTF8等编码不能识别大数字的字符,也即1XXX XXXXb会被错误认知,具体可以看UTF8的编码原理。而我们在转换的过程中,很可能会有比较大的十六进制码,比如0xFF,于是就会导致了错误识别。
那么怎么解决这个方法呢?那就是不要用字符串去保存文件了。将原生字符串转换为Uint8Array的数组,然后再通过FileSaver保存到文件。注意opt要使用application/octet-stream的选项。
var arrBuff = new ArrayBuffer(bytes.length);
var arr = new Uint8Array(arrBuff);
for (var i = 0; i < bytes.length; i++) {
arr [i] = bytes[i];
}
var blob = new Blob([arr], {type: "application/octet-stream"});
saveAs(blob, "download.bin");