js读取本地Hex文件数据

       项目上需求,需要在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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。