Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数组转换为十六进制文件_Javascript_File_Hex - Fatal编程技术网

Javascript 将数组转换为十六进制文件

Javascript 将数组转换为十六进制文件,javascript,file,hex,Javascript,File,Hex,我想创建一个保存/下载的十六进制文件 结果应为十六进制格式的文件,如下所示: 5350 4401 011a 000a 0900 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00f8 ff1e ffff ffff b9ff c03b e6bf fbd8 bffb bccc 671c fdee eefd eefe ec6f 3800 0fc0 0003 c000 0180 0f00 1c00 003e 0003 c1e0 07ff f

我想创建一个保存/下载的十六进制文件

结果应为十六进制格式的文件,如下所示:

5350 4401 011a 000a 0900 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
00f8 ff1e ffff ffff b9ff c03b e6bf fbd8
bffb bccc 671c fdee eefd eefe ec6f 3800
0fc0 0003 c000 0180 0f00 1c00 003e 0003
c1e0 07ff f006 3e30 05dd d003 dde0 07be
f00f 6378 0edd b80e 1c38 0f1c 7877 9cf7
7bdd ef7d dddf 1edd bc0f 1c78 07c1 f003
dde0 01be c000 1c00 6f00 1013 4340 3055
6208 181b 4b48 385d 6a72 7678 7b7e 8087
898c 9098 0713 1444 4337 5766 0f1b 1c4c
4b3f 5f6e 7577 7a7d 7f86 888b 8e97 9f02
0610 1006 0205 0502 0610 1006 0205 0503
0204 0304 0503 0303 0202 8080 8080 8080
9090 8080 8080 8080 9090 8080 8080 8080
8080 8080 80
我已经尝试过此解决方案: 但似乎被困在某个地方

我的代码

  var bytes = new Array(122, 13, 14, 9, 255); // integer values

  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];
  }

  save_file(ia,"hexfile.bin");

  save_file(data, filename)
  {

      var file = new Blob([data], {type: "octet/stream"});
      if (window.navigator.msSaveOrOpenBlob) // IE10+
          window.navigator.msSaveOrOpenBlob(file, filename);
      else { // Others
          var a = document.createElement("a"),
                  url = URL.createObjectURL(file);
          a.href = url;
          a.download = filename;
          document.body.appendChild(a);
          a.click();
          setTimeout(function() {
              document.body.removeChild(a);
              window.URL.revokeObjectURL(url);  
          }, 0); 
      }
  }
var bytes=新数组(122、13、14、9、255);//整数值
var ab=新的ArrayBuffer(bytes.length)//bytes是包含整数的数组
var ia=新的UINT8阵列(ab);
对于(变量i=0;i
保存文件是可行的,但内容不是我所期望的。 非常感谢您的帮助,谢谢

结果应为十六进制格式的文件,如下所示:

5350 4401 011a 000a 0900 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
00f8 ff1e ffff ffff b9ff c03b e6bf fbd8
bffb bccc 671c fdee eefd eefe ec6f 3800
0fc0 0003 c000 0180 0f00 1c00 003e 0003
c1e0 07ff f006 3e30 05dd d003 dde0 07be
f00f 6378 0edd b80e 1c38 0f1c 7877 9cf7
7bdd ef7d dddf 1edd bc0f 1c78 07c1 f003
dde0 01be c000 1c00 6f00 1013 4340 3055
6208 181b 4b48 385d 6a72 7678 7b7e 8087
898c 9098 0713 1444 4337 5766 0f1b 1c4c
4b3f 5f6e 7577 7a7d 7f86 888b 8e97 9f02
0610 1006 0205 0502 0610 1006 0205 0503
0204 0304 0503 0303 0202 8080 8080 8080
9090 8080 8080 8080 9090 8080 8080 8080
8080 8080 80
十六进制只是文件/缓冲区中内容的可视表示形式。内容本身存储为字节(十六进制范围[0x00,0xff],十进制范围[0255]等)

现在,您正在根据包含实际字节的数组长度创建一个空数组:

var ab = new ArrayBuffer(bytes.length);  // will be empty
var ia = new Uint8Array(ab);             // therefor also empty
只需将其直接转换为:

var ia = new Uint8Array(bytes);          // Array converted to typed array incl. content
现在,使用正确的mime类型将其传递给Blob或File对象(这并不重要,因为它与浏览器如何处理文件有关,而不是更改内容-未知的mime类型将按如下方式处理):

或者,如果您想要文件名:

var file = new File([ia], "hexfile.bin", {type: "application/octet-stream"});
然后将其用作(或使用您已有的功能以获得更好的兼容性):

示例(在十六进制编辑器中保存并打开结果,其中应包含0x00到0x0f范围内表示的字节):

var bytes=数组(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
var ia=新的Uint8Array(字节);
var file=新文件([ia],“hexfile.bin”,{type:“application/octet stream”});

document.location=URL.createObjectURL(文件)您实际得到的结果是什么?认识到没有十六进制格式的文件,这就是在十六进制编辑器中查看二进制文件的方式,除非您的目的是用该格式中每个字节的十六进制值创建一个文本文件谢谢K3N花时间以如此好的方式解释这一点,这非常有用。原来我以前有过这个,但忽略了一个小细节,这让我觉得我采用了错误的方法:文件在例如Sublime中打开时,以UTF-8的形式打开。有没有办法确保文件被编码为十六进制?再次感谢您的帮助和解决方案!我感觉像Sublime这样的编辑是根据数据计数来决定编码的,这取决于内容。这里的二进制转换不会影响编码,但如果稍后将其视为文本,则可能会影响编码。升华可能在开始时看到(或不看到)a,或者输入的字节顺序错误(如果来自UTF16等)。如果您主要处理二进制文件的文本输入,则可以考虑使用。
document.location = URL.createObjectURL(file);