2016-06-21 6 views
0

私はそれをJSON化するためにArrayBufferオブジェクトのビューを作成しようとしています。どの型付き配列を使用するかはどのように決定しますか?

var data = { data: new Uint8Array(arrayBuffer) } 
var json = JSON.stringify(data) 

ArrayBufferのサイズも最小Uint8Arrayと関係ないようです。私はこれまでRangeErrorを取得していませんでした:)もしそうなら、どのタイプの配列を使用するかを決めるにはどうすればいいですか?

+0

バッファに格納されているデータに基づいて決定するか、そのデータの解釈に基づいて決定することをお勧めします。 –

+3

また、 'Uint8Array'は8ビット配列ではなく、符号なし8ビット整数の配列です。任意の長さにすることができます。 'Uint16Array'と同じ' ArrayBuffer'から作成された 'Uint8Array'は、' ArrayBuffer'のすべてのバイトが 'Uint8Array'の1つの要素として「配置」されるため、2倍の長さになります。 'Uint16Array'バイトの各ペアは、配列内の1つの要素に「なる」ようになります。 –

+0

@SergiuParaschivあなたは答えとして投稿しておくべきです。あなたはそれを完全に説明しました。 –

答えて

3

バッファに格納されているデータに基づいて決定するか、そのデータの解釈に基づいて判断することをお勧めします。

また、Uint8Arrayは8ビット配列ではなく、符号なし8ビット整数の配列です。任意の長さにすることができます。 ArrayBufferの各バイトがUint8Arrayの要素の1つとして「配置」されるため、ArrayBufferが​​と同じであるために作成されるUint8Arrayは2倍の長さになりますが、​​の場合、アレイ内の1つの要素になります。

私たちがバイナリで考えてみると良いことが起こります。これを実行してみてください:

var buffer = new ArrayBuffer(2); 
var uint8View = new Uint8Array(buffer); 
var uint16View = new Uint16Array(buffer); 

uint8View[0] = 2; 
uint8View[1] = 1; 

console.log(uint8View[0].toString(2)); 
console.log(uint8View[1].toString(2)); 
console.log(uint16View[0].toString(2)); 

バイナリ、2の符号なし8ビット整数は00000010であり、1は00000001(ゼロを主要toStringストリップ)であるとして表示するので、出力は

10 
1 
100000010 

になるだろう。

Uint8Arrayは、バイトの配列を表します。私が言ったように、要素は符号なし8ビット整数です。私たちはちょうどそれに2バイトを押しました。

これらの2バイトは、00000001 00000010(バイナリ形式のものをもう一度明確にするために)として並べて格納されます。今

あなたは同じバイトが含まれているために起こっている同じバッファ上​​を初期化しますが、要素は、符号なし16ビット整数(2バイト)であるので、あなたがuint16View[0]にアクセスするときには、最初のを取るために起こっていますバイトし、それらをあなたに戻してください。したがって0000000100000010は、先頭に0がない100000010です。

このデータを基本10(10進)整数として解釈すると、基数10(258)には0000000100000010であることがわかります。

Uint8Arrayでも​​でもデータはすべて保存されません。それらは単にArrayBufferのバイトにアクセスする異なる方法です。

howどちらを選択すればよいですか?それは好みに基づいているのではなく、根底にあるデータに基づいています。 ArrayBufferは、いくつかの外部ソース(ウェブソケットかもしれない)からバイナリデータを受け取ったときに使用され、すでにがデータを表していることを知っています。これは、符号なし8ビット整数、または符号付き16ビット整数のリスト、または最初の要素が8ビット整数で、次の要素が16ビットであることが分かっている混合リストでもあります。次に、DataViewを使用して、入力項目を読み取ることができます。 データの内容がわからない場合は、使用するものを選択できません。

+0

印象的な答え!徹底的に+1。 – sawa

+0

DataViewを使用せず、JSON化してAJAXリクエストでデシリアライズするためにArrayBufferのビューを作成する必要がある場合、データ形式は問題になりません。ただし、Uint8Arrayは高速ですか? – sawa

+1

あなたは全く違いを見ません。これらのすべては、単にデータを解釈するための「ビュー」に過ぎません。データ自体はバッファに格納されます。 –

関連する問題