项目上需求,需要在Web端对本地连接的设备进行固件升级,固件包为Hex串形式,常用的读取方式如下所述,都不能直接正确读到Hex文件内容,readAsText读出来的是乱码和不可见字符,readAsArrayBuffer读出来两个字节Hex串是用八位显示的,导致读出的数组有负数,也不能直接使用。但其读出的结果转成Uint8Array并配上Bytes2HexString方法,即可实现需求,特记录于此,以备再用。
常用读取方式:
- readAsText(file, encoding):以纯文本形式读取文件,读取到的文本保存在result属性中。第二个参数代表编码格式。
- readAsDataUrl(file):读取文件并且将文件以数据URI的形式保存在result属性中。
- readAsBinaryString(filHexe):读取文件并且把文件以字符串保存在result属性中。
- readAsArrayBuffer(file):读取文件并且将一个包含文件内容的ArrayBuffer保存咋result属性中。
html代码:
<input type="file" id="upgradeInuputFile">
js代码:
document.getElementById('upgradeInputFile').addEventListener('change',
function selectedFileChanged() {
if (this.files.length === 0) {
RIG.msgFailing("请选择文件!");
return;
}
const reader = new FileReader();
reader.onload = function fileReadCompleted() {
//console.log(reader.result);
//通过字节数组转十六进制字符串,对负值填坑
var bytes = new Uint8Array(this.result);
let hex = Bytes2HexString(bytes);
//console.log(hex);
};
reader.readAsArrayBuffer(this.files[0]);
}
);
function Bytes2HexString(arrBytes) {
var str = "";
for (var i = 0; i < arrBytes.length; i++) {
var tmp;
var num=arrBytes[i];
if (num < 0) {
//此处填坑,当byte因为符合位导致数值为负时候,需要对数据进行处理
tmp =(255+num+1).toString(16);
} else {
tmp = num.toString(16);
}
if (tmp.length == 1) {
tmp = "0" + tmp;
}
str += tmp;
}
return str;
}