6

型付き配列の仕様には、既存の ArrayBuffer を取り、それを別の配列型として扱うことを可能にするコンストラクターがあります。興味深いことに、オフセット パラメータは、構築された配列の基になる型の倍数でなければなりません。この制限の理由は何でしたか?

背景として - WebSocket 経由で送信されるバイナリ バッファをエンコードしようとしています。バッファーには、さまざまなサイズのさまざまな変数が含まれています。もともと私は次のコードを使用したかった:

var buffer = new ArrayBuffer(10);
new Uint32Array(buffer, 0, 1)[0] = 234;
new Int16Array(buffer, 4, 1)[0] = -23;
new Uint32Array(buffer, 6, 1)[0] = 6000;  // Exception is raised here, 
                                          // because 6 is not multiple of 4

これを機能させるには、最後の行を次のように書き直す必要があります。

var tempArray = new Uint32Array(1);         // Create 32-bit array
tempArray[0] = 6000;                        // Write 32-bit number
var u8Src = new Uint8Array(tempArray, 0);   // Create 8-bit view of the array
var u8Dest = new Uint8Array(buffer, 6, 4);  // Create 8-bit view of the buffer
u8Dest.set(u8Src);                          // Copy bytes one by one

これは、このような単純な操作にはコードが多すぎます。

4

1 に答える 1

8

アライメントされていないメモリ アクセスは、すべてのプラットフォームで機能するわけではありません。

要素サイズの倍数ではないオフセットで Float32Array を作成できないのはなぜですか? http://en.wikipedia.org/wiki/Data_structure_alignment

DataView オブジェクトを使用して、整列されていないデータにアクセスします。

https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/DataView

于 2013-03-23T17:13:13.007 に答える