Javascript-使用FileReader将二进制记录读入ArrayBuffers

Javascript-使用FileReader将二进制记录读入ArrayBuffers,javascript,html,filereader,Javascript,Html,Filereader,我有一个二进制数据文件,其中每个x字节都是一个记录,我有一些格式/掩码(不管你怎么看)来解密这些数据。就像是,short-short-int-short-float-double,诸如此类。所以我正在阅读这个文件,我最终需要使用s,但我还没到那个里。。。所以我的问题有两个方面。首先,也是最直接的,将二进制文件中的每个x字节读入ArrayBuffer的最佳方法是什么? 第二,因为我遇到了一些问题为什么在读取500kb二进制文件时,下面的脚本几乎立即填充5gb+的RAM? $('input[type

我有一个二进制数据文件,其中每个
x
字节都是一个记录,我有一些格式/掩码(不管你怎么看)来解密这些数据。就像是,
short-short-int-short-float-double
,诸如此类。所以我正在阅读这个文件,我最终需要使用s,但我还没到那个里。。。所以我的问题有两个方面。首先,也是最直接的,将二进制文件中的每个
x
字节读入ArrayBuffer的最佳方法是什么?

第二,因为我遇到了一些问题为什么在读取500kb二进制文件时,下面的脚本几乎立即填充5gb+的RAM?

$('input[type="file"]').change(function(event) {

  // FileList object
  var files = event.target.files;
  for (var i = 0, f; f = files[i]; i++) {

    var reader = new FileReader();

    // closures and magnets, how do they work
    reader.onload = (function(f) {
      return function(event) {

        // data file starts with header XML
        // indexOf +9 for </HEADER> and +1 for null byte
        var data_start = event.target.result.indexOf('</HEADER>')+10,

          // leverage jQuery for XML
          header = $(event.target.result.slice(0,data_start)),
          rec_len = parseInt(header.find('REC_LEN').text(),10);

        // var ArrayBuffer
        // define ArrayBufferView

        // loop through records
        for (var i = data_start; i<event.target.result.length; i+=rec_len) {

          // fill ArrayBuffer
          // add data to global data []
          console.log(i+' : '+event.target.result.slice(i, i+rec_len));
        }
      };
    })(f);

    // Read as Binary
    reader.readAsBinaryString(f);
  }
});
$('input[type=“file”]”)。更改(函数(事件){
//文件列表对象
var files=event.target.files;
for(var i=0,f;f=files[i];i++){
var reader=new FileReader();
//封口和磁铁,它们是如何工作的
reader.onload=(函数(f){
返回函数(事件){
//数据文件以头XML开头
//indexOf+9表示空字节,indexOf+1表示空字节
var data_start=event.target.result.indexOf(“”)+10,
//利用jqueryforxml
header=$(event.target.result.slice(0,数据\u开始)),
rec_len=parseInt(header.find('rec_len').text(),10);
//阵列缓冲器
//定义ArrayBufferView
//循环浏览记录

对于(var i=data_start;i至少有几个一般提示:

使用a是灵活的,但有点慢——它应该比字符串上调用的
parseInt
快,但不如数组视图快。好处是,如果二进制数据需要,它支持不同的字节顺序。使用
reader.readAsArrayBuffer(f)
,然后在
onload
回调中,使用

var dv = new DataView(arrayBuffer, [startCoord, [endCoord]]),
    result = [];
// in some loop for i...
    result[i] = [];
    result[i].push(dv.getInt8(coord));
    // coord += offset;
    result[i].push(dv.getFloat32(coord));
// end some loop
正如我所提到的,在ArrayBuffer上创建多个会更快,但是(据我所知)不能在运行时更改光标位置——因此混合数据类型将是一个问题


要将结果放入类型化数组,只需声明类似于
var col1=Uint8Array(length)的内容;
。类型化数组子类已列出。请注意,根据我的经验,类型化数组在性能方面不会给您带来太多好处。搜索类型化数组的一些jsperf测试。

可能是日志记录或其他工件导致内存膨胀?ArrayBuffers应该只占用您分配的内存?行
reader.onload=函数(f){返回函数(事件){…<代码>可以简化为<代码>读取器.OnLoad=函数(事件){……/>代码> BTW。您查看过FieleRADER?Read SalayBuffER(?)@我有什么,这就是我在解决方案中所用的!@ Savigg也许你应该考虑回答你自己的问题,以获得别人的利益: