1

を介してバイナリ ファイルをループし、arrayBuffer1024 個の浮動小数点のセットを取得する必要があります。私はこれをやっています:

// 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で最初のビューを
宣言した後、ループが失敗するのはなぜですか?Float32Arrayresponse_offer

4

2 に答える 2

0

そう。最後に理解してください...おそらくこれは、次の人が疑問に思うのに役立ちます:

まず、 4 バイトの単一形式であるデータを読み取ろうとして、すべてが間違っていました。

  • これは、配列に多くのエントリがあることを意味しますarrayBufferbyteLength = 49182
  • 私の配列は4 byte single formatであるため、 SO-help検索で、これはgetFloat32 ANDで読み取り可能であり、4 つのエントリが 1 つの「実際の」値で構成されていることがわかりました。
  • 私のデータには、列ごとに1024の単位で保存された4000のデータポイントの3つの測定値が含まれています。
  • したがって、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]
    
  • 1024 チャンクの 3x4000 データポイントがいくつかの空の結果を返すため、最後のスニペットには 288 の空の結果が含まれます。

  • 読むために、私はここで素敵なスニペットを見つけました(動的高範囲レンダリング)、これは私を助けました:

      // ...
      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 に答える