Javascript文件读取器错误地读取文件

Javascript文件读取器错误地读取文件,javascript,ecmascript-6,filereader,iso-8859-1,windows-1252,Javascript,Ecmascript 6,Filereader,Iso 8859 1,Windows 1252,我有一个简短的JavaScript函数,它将获取一个上传的文件并显示它的十六进制等价物。将原始文件与十六进制编辑器中的输出进行比较,可以看出它们部分不同,但并非完全不同 String.prototype.hexEncode = function(){ var hex, i; var result = ""; for (i = 0; i < this.length; i++) { hex = this.charCodeAt(i).toString(16); re

我有一个简短的JavaScript函数,它将获取一个上传的文件并显示它的十六进制等价物。将原始文件与十六进制编辑器中的输出进行比较,可以看出它们部分不同,但并非完全不同

String.prototype.hexEncode = function(){
  var hex, i;

  var result = "";
  for (i = 0; i < this.length; i++) {
    hex = this.charCodeAt(i).toString(16);
    result += ("" + hex).slice(-4);
  }

  return result
}

function upload() {
  var file = document.getElementById("fileToUpload").files[0];
  var reader = new FileReader();
  reader.readAsText(file, "windows-1252");
  reader.onload = function (evt) {
    var program = evt.target.result.hexEncode();
    program = program;
    console.log(program);
  }
}

是什么导致了产出的差异?任何帮助都将不胜感激。

要在js中生成十六进制转储,您不想使用
readAsText
方法,该方法将在UCS-2或UTF-16中转换数据,而是直接读取从该方法获得的二进制数据,然后从那里开始工作:

函数hextump(文件){
返回新承诺((res,rej)=>{
如果(!(Blob的文件实例))rej('输入错误');
const reader=new FileReader();
reader.onload=e=>{
res(十六进制(reader.result));
};
reader.onerror=e=>rej(“读取时出错”);
reader.readAsArrayBuffer(文件);
});
//从https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#Example
函数十六进制(缓冲区){
常量hexCodes=[];
常量视图=新数据视图(缓冲区);
for(设i=0;ihextdump(inp.files[0].slice(01100))//对于演示,我将文件切片
.then(hex=>console.log(hex))
.catch(e=>console.error(e))

而不是可能改变内容的
.readAsText
,您尝试过吗?绝对不要尝试从readAsText结果生成十六进制转储。此外,使用非默认编码。readAsArrayBuffer是您想要的。预期的结果是什么?输入和输出是相同的。
2A 2A 54 49 38 33 46 2A 1A 0A 0A 43 72 65 61 74
2A 2A 54 49 38 33 46 2A 1A AA 43 72 65 61 74 65