如何在“4字节单”/浮点/ IEEE 754编码数据中读取带有二进制数据的ArrayBuffer?

时间:2014-05-24 22:29:46

标签: javascript filereader arraybuffer typed-arrays

我需要通过arrayBuffer遍历二进制文件并检索1024个浮点集。我这样做:

// chunk_size = 1024
// chunk_len = 48
// response_buffer = ArrayBuffer
// response_buffer.byteLength = 49152
for (i = chunk_len; i > 0; i -= 1) {
    switch (i) {
        case (chunk_len):

            // create view from last chunk of 1024 out of 49152 total
            float_buffer = new Float32Array(response_buffer, ((i - 1) * chunk_size));

            // add_data(net_len, float_buffer);
            break;

        case 0:
            break;

        default:
            float_buffer = new Float32Array(response_buffer, ((i - 1) * chunk_size)), chunk_size);
            //add_data(net_len, float_buffer);
            break;
    }
}

我的问题是,如果我在第一次运行时调用此缓冲区结束:

// i - 1 = 47 * chunk_size
new Float32Array(response_buffer, ((i - 1) * chunk_size));

同一个语句在我调用的下一次运行中失败:

new Float32Array(response_buffer, ((i - 1) * chunk_size), 1024);

虽然我可以阅读here,但那 我可以这样做:

Float32Array Float32Array(
    ArrayBuffer buffer,
    optional unsigned long byteOffset,
    optional unsigned long length
);

问题
在我的Float32Array ArrayBuffer上声明第一个response_offer视图后,为什么我的循环失败?

2 个答案:

答案 0 :(得分:1)

我认为你在“默认”案件的第一行有一个额外的“)”。

float_buffer = new Float32Array(response_buffer, ((i - 1) * chunk_size)), chunk_size);

应该是:

float_buffer = new Float32Array(response_buffer, ((i - 1) * chunk_size), chunk_size);

答案 1 :(得分:0)

因此。终于明白了...也许这有助于下一个人疑惑:

首先 - 我试图读取我的数据是错误的,这是 4字节单格式

  • 如果我有arrayBuffer byteLength = 49182这意味着我的数组中有很多条目。
  • 由于我的数组是4 byte single format,我发现有一些SO-helpsearchinggetFloat32 AND 可以读取这4个条目包含一个“真实”值
  • 我的数据包含 3 测量 4000 数据点,以 1024 为单位逐列存储。
  • 因此,如果我有12000个数据点和49182/4 = 12288数据点,我的数据结构末尾将有288个空数据点。

  • 所以我的二进制数据应该像这样存储:

          0 -  1024    a
       1025 -  2048    a
       2049 -  3072    a
       3072 -  4000   [a
       4001 -  4096    b]
       4097 -  5120    b
       5121 -  6144    b
       6145 -  7168    b
       7169 -  8000   [b
       8001 -  8192    c]
       8193 -  9216    c
       9217 - 10240    c
      10240 - 11264    c
      11264 - 12000   [c
      12000 - 12288    0]
    
  • 我的最终片段将包含288个空结果,因为1024个块中的3x4000数据点将返回一些空结果

  • 为了阅读,我找到了一个不错的代码段here (dynamic high range rendering),这对我有所帮助:

      // ...
      raw_data = ...
      data = new DataView(raw_data);
    
      ...
      tmp_data = new Float32Array(byte_len / Float32Array.BYTES_PER_ELEMENT);
      len = tmp_data.length;
    
      // Incoming data is raw floating point values with little-endian byte ordering.
      for (i = 0; i < len; i += 1) {
        tmp_data[i] = data.getFloat32(i * Float32Array.BYTES_PER_ELEMENT, true);
      }
    
  • 现在我有一个单独的数组,我可以使用它来构建我的处理结构。