1

我需要通过一个二进制文件循环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);

虽然我可以在这里阅读,但我可以这样做:

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

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

4

2 回答 2

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);
于 2014-05-24T23:32:02.457 回答
0

所以。终于明白了......也许这有助于下一个人想知道:

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

  • 如果我有arrayBufferbyteLength = 49182意味着我的数组中有很多条目。
  • 由于我的数组是4 byte single format,我通过一些SO-help发现这是可读的getFloat32 并且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 个数据点将返回一些空结果

  • 要阅读,我在这里找到了一个不错的片段(动态高范围渲染),它帮助我做到了这一点:

      // ...
      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);
      }
    
  • 现在我有一个数组,我可以使用它来构建我的处理结构。

于 2014-05-25T12:25:54.260 回答