Web éçºã§ã¯ããã¡ã¤ã«(ä½æãæ´æ°ããã¦ã³ãã¼ã)ãå¦çããã¨ãã«ãã¤ããªãã¼ã¿ã«åºãããã¾ãããã®ä»ã®å ¸åçãªã¦ã¼ã¹ã±ã¼ã¹ã¯ç»åå¦çã§ãã
ãããã¯ãã¹ã¦ JavaScript ã§å¯è½ã§ããã¾ãããã¤ããªæä½ã髿§è½ã§ãã
ã§ãããå¤ãã®ã¯ã©ã¹ãåå¨ããããå°ãæ··ä¹±ããããã§ããããã¤ãä¾ãæãã¾ã:
ArrayBuffer,Uint8Array,DataView,Blob,File, etc.
JavaScript ã§ã®ãã¤ããªãã¼ã¿ã¯ãä»ã®è¨èªã¨æ¯ã¹ã¦éæ¨æºçãªæ¹æ³ã§å®è£ ããã¦ãã¾ããããããä¸åº¦æ´çã§ããã°ããã¹ã¦ãã¨ã¦ãç°¡åã«ãªãã¾ãã
åºæ¬ã¨ãªããã¤ããªãªãã¸ã§ã¯ã㯠ArrayBuffer ã§ããããã¯åºå®é·ã®é£ç¶ããã¡ã¢ãªé åã¸ã®åç
§ã§ãã
次ã®ããã«ãã¦çæã§ãã¾ã:
let buffer = new ArrayBuffer(16); // é·ã 16 ã®ãããã¡ã使
alert(buffer.byteLength); // 16
16ãã¤ãã®é£ç¶ããã¡ã¢ãªé åãå²ãå½ã¦ãããäºåã«ã¼ãã§åãããã¾ãã
ArrayBuffer ã¯ä½ãã®é
åã§ã¯ããã¾ããæ··ä¹±ã®å
ã¯æé¤ãã¾ããããArrayBuffer 㯠Array ã¨ã¯ä½ã®å
±éç¹ãããã¾ããã:
- é·ãã¯åºå®ã§ã墿¸ãããã¨ã¯ã§ãã¾ããã
- ã¡ã¢ãªã®ä¸ã§ãé·ãã¡ããã©ã®ã¹ãã¼ã¹ãã¨ãã¾ãã
- åã
ã®ãã¤ãã«ã¢ã¯ã»ã¹ããã«ã¯ã
buffer[index]ã§ã¯ãªããå¥ã® âviewâ ãªãã¸ã§ã¯ããå¿ è¦ã§ãã
ArrayBuffer ã¯ã¡ã¢ãªé åã§ããä½ãæ ¼ç´ããã¦ããã§ãããï¼ããã¯åããã¾ãããåã«çã®ãã¤ãåã§ãã
ArrayBuffer ãæä½ããã«ã¯ãâãã¥ã¼(view)â ãªãã¸ã§ã¯ãã使ç¨ããå¿
è¦ãããã¾ãã
ãã¥ã¼ãªãã¸ã§ã¯ãã¯èªèº«ã«ã¯ä½ãæ ¼ç´ãã¾ããããã㯠ArrayBuffer ã«æ ¼ç´ããããã¤ãã¸ã®è§£éãä¸ãã âã¡ã¬ãâ ã§ãã
ä¾:
Uint8ArrayâArrayBufferã«ããåãã¤ããã 0 ãã 255 (1ãã¤ãã¯8ããã)ã¾ã§ã®å¤ã¨ãªããå¥ã ã®æ°ã¨ãã¦æ±ãã¾ãããã®ãããªå¤ã¯ â8ããã符å·ãªãæ´æ°(8-bit unsigned integer)â ã¨å¼ã°ãã¾ããUint16Arrayâ å2ãã¤ããã0 ãã 65535 ã¾ã§ã®å¤ã¨ãªãæ´æ°ã¨ãã¦æ±ãã¾ãããã㯠â16ããã符å·ãªãæ´æ°â ã¨å¼ã°ãã¾ããUint32Arrayâ å4ãã¤ãã 0 ãã 4294967295 ã¾ã§ã®å¤ã¨ãªãæ´æ°ã¨ãã¦æ±ãã¾ãããã㯠â32ããã符å·ãªãæ´æ°â ã¨å¼ã°ãã¾ããFloat64Arrayâ å8ãã¤ãã5.0x10-324ãã1.8x10308ã¾ã§ã®å¤ã¨ãªãæµ®åå°æ°ç¹ã¨ãã¦æ±ãã¾ãã
ãããã£ã¦ã16ãã¤ãã® ArrayBuffer ã«ãããã¤ããªãã¼ã¿ã¯ 16 åã® âå°ããæ°åâ, ããã㯠8 åã®ãã大ããæ°å(2ãã¤ããã¤), ã¾ã㯠4 åã®ãã大ããªæ°å(4ãã¤ããã¤), é«ç²¾åº¦ã®2åã®æµ®åå°æ°ç¹å¤(8ãã¤ããã¤ã¨ãã¦è§£éã§ãã¾ãã
ArrayBuffer ã¯ã³ã¢ã¨ãªããªãã¸ã§ã¯ãããã¹ã¦ã®ãã®ã®ã«ã¼ããçã®ãã¤ããªãã¼ã¿ã§ãã
ã§ãããããã«æ¸ãè¾¼ãã ãå復ãããã¨ããå ´åãåºæ¬çã«ã»ã¼ãã¹ã¦ã®æä½ã«å¯¾ãã¦ããã¥ã¼ã使ç¨ããå¿ è¦ãããã¾ããe.g:
let buffer = new ArrayBuffer(16); // é·ã 16 ã®ãããã¡ã使
let view = new Uint32Array(buffer); // 32 ãããæ´æ°åã¨ãã¦ãããã¡ãæ±ãã¾ã
alert(Uint32Array.BYTES_PER_ELEMENT); // 4 ãã¤ãæ¯ã®æ´æ°
alert(view.length); // 4, å¤ãã®æ´æ°ãæ ¼ç´ããã¾ã
alert(view.byteLength); // 16, ãã¤ããµã¤ãº
// å¤ã®æ¸ãè¾¼ã¿
view[0] = 123456;
// å¤ã®ã¤ãã¬ã¼ã
for(let num of view) {
alert(num); // 123456, 次㫠0, 0, 0 (å
¨é¨ã§ 4 ã¤ã®å¤)
}
TypedArray
ããããã¹ã¦ã®ãã¥ã¼ (Uint8Array, Uint32Array, etc) ã®å
±éã®ç¨èªã¯ãTypedArray ã§ãããããã¯åãã¡ã½ããã¨ããããã£ã®ã»ãããå
±æãã¾ãã
ãããã¯é常ã®é åã«ããä¼¼ã¦ãã¾ã: ã¤ã³ããã¯ã¹ããããå復å¯è½(iterable)ã§ãã
åä»ãé
åã®ã³ã³ã¹ãã©ã¯ã¿ (Int8Array ã§ã Float64Array ã§ãæ§ãã¾ãã)ã¯ã弿°ã®ç¨®é¡ã«å¿ãã¦ç°ãªãæ¯ãèãããã¾ãã
5 ã¤ã®å¼æ°ã®ãã¿ã¼ã³ãããã¾ã:
new TypedArray(buffer, [byteOffset], [length]);
new TypedArray(object);
new TypedArray(typedArray);
new TypedArray(length);
new TypedArray();
-
ArrayBufferã®å¼æ°ãä¸ããããã¨ãããã«å¯¾ãããã¥ã¼ãä½ããã¾ããæã ã¯ãã§ã«ãã®æ§æã使ãã¾ããããªãã·ã§ã³ã§ã
byteOffsetã§éå§ä½ç½®(ããã©ã«ã㯠0)ãlengthã§é·ã(ããã©ã«ãã§ã¯ãããã¡ã®çµããã¾ã§) ãæå®ãããã¨ãã§ãããã®å ´åã¯ãã¥ã¼ã¯bufferã®ä¸é¨ã ããã«ãã¼ãã¾ãã -
Arrayã¾ãã¯é åã©ã¤ã¯ãªãªãã¸ã§ã¯ããä¸ããããå ´åã¯ãåãé·ãã®åä»ãé åãçæããå 容ãã³ãã¼ãã¾ããããã使ã£ã¦é åã«ãã¼ã¿ãäºåã«åãè¾¼ããã¨ãã§ãã¾ã:
let arr = new Uint8Array([0, 1, 2, 3]); alert( arr.length ); // 4 alert( arr[1] ); // 1 -
å¥ã®
TypedArrayãä¸ããããå ´åãåãã§ã: åãé·ãã®åä»ãé åãçæããå¤ãã³ãã¼ãã¾ããå¤ã¯ãã®å¦çã®ä¸ã§æ°ããåã«å¤æããã¾ããlet arr16 = new Uint16Array([1, 1000]); let arr8 = new Uint8Array(arr16); alert( arr8[0] ); // 1 alert( arr8[1] ); // 232 (1000 ãã³ãã¼ãããã¨ãã¾ããã1000 㯠8 ãããã«ã¯åã¾ãã¾ãã(1000 㯠11 1110 1000, 232 㯠1110 1000) -
æ°å¤å¼æ°ã®å ´åã¯
lengthã§ããããã®æ°ã®è¦ç´ ãå«ãåä»ãé åã使ãã¾ãããã®ãã¤ãé·ã¯ãä¸ã¤ãããã®ã¢ã¤ãã ã®ãã¤ãæ°TypedArray.BYTES_PER_ELEMENTãlengthåããããã®ã«ãªãã¾ãã:let arr = new Uint16Array(4); // é·ã 4 ã®åä»ãé åã使ãã¾ãã alert( Uint16Array.BYTES_PER_ELEMENT ); // è¦ç´ ããã 2 ãã¤ãã§ã alert( arr.byteLength ); // 8 (ãã¤ããµã¤ãº) -
弿°ããªããã°ãé·ãã¼ãã®åä»ãé åã使ãã¾ãã
ArrayBuffer ã«è¨åãããã¨ãªããç´æ¥ TypedArray ã使ãããã¨ãã§ãã¾ãããããããã¥ã¼ã¯ãã®æ ¹åºã«ãã ArrayBuffer ãªãã§ã¯åå¨ã§ããªããããæåã®ã±ã¼ã¹(ArrayBuffer ãä¸ããããå ´å)ãé¤ãããã¹ã¦ã®å ´åã«èªåçã«ä½æããã¾ãã
ArrayBuffer ã«ã¢ã¯ã»ã¹ããã«ã¯ã次ã®ããããã£ã使ãã¾ã:
arr.bufferâArrayBufferã¸ã®åç §ã§ããarr.byteLengthâArrayBufferã®é·ãã§ãã
ãã®ããããã¤ã§ããããã¥ã¼ããå¥ã®ãã¥ã¼ã¸ç§»åããããã¨ãã§ãã¾ãã:
let arr8 = new Uint8Array([0, 1, 2, 3]);
// åããã¼ã¿ãå¥ã®ãã¥ã¼ã§
let arr16 = new Uint16Array(arr8.buffer);
åä»ãé åã®ä¸è¦§ã§ã:
Uint8Array,Uint16Array,Uint32Arrayâ 8, 16, 32 ãããæ´æ°ã®å ´åUint8ClampedArrayâ 8ãããæ´æ°ã®å ´åãä»£å ¥æã« âã¯ã©ã³ãâ ãã¾ã (ä¸è¨åç §)ã
Int8Array,Int16Array,Int32Arrayâ 符å·ä»ãæ´æ°ã®å ´å(è² ã®å¤ã«ãªããã¨ãããã¾ãï¼ãFloat32Array,Float64Arrayâ 32, 64 ããã符å·ä»ãæµ®åå°æ°ç¹ã®å ´åã
int8 ã¾ãã¯ããã«é¡ä¼¼ããåä¸å¤ã®åã¯ããã¾ããæ³¨æãã¦ãã ãããInt8Array ã®ãããªååã«ãããããããJavaScript ã«ã¯ int ããã㯠int8 ã®ãããªåä¸å¤ã®åã¯ããã¾ããã
ç¹°ãè¿ãã¾ãããInt8Array ã¯ãããã®åã
ã®å¤ã®é
åã§ã¯ãªããArrayBuffer ã®ãã¥ã¼ã§ãã
ç¯å²å¤ã®åä½
ããç¯å²å¤ã®å¤ãåä»ãé åã«æ¸ãè¾¼ããã¨ããã¨ã©ããªãã§ãããï¼ã¨ã©ã¼ã«ã¯ãªãã¾ããããä½åãªããããåãæ¨ã¦ããã¾ãã
ä¾ãã°ã256 ã Uint8Array ã«ç½®ããã¨ãèãã¦ã¿ã¾ããããäºé²æ³(ãã¤ããªå½¢å¼)ã§ã¯ã256 㯠100000000 (9ããã)ã§ãããUint8Array ã¯å¤ãã¨ã« 8 ãããããæä¾ããã0 ãã 255 ã¾ã§ã®ç¯å²ã§ãã
ç¯å²ãè¶ ãããããªãã大ããæ°å¤ã®å ´åã(éè¦åº¦ã®ä½ã)å³ç«¯ã®8ãããã ããæ ¼ç´ãããæ®ãã¯åãæ¨ã¦ããã¾ãã:
ãã®ãããã¼ãã«ãªãã¾ãã
257 ã®å ´åãäºé²æ³ã¯ 100000001 (9ããã)ã§ãå³ç«¯ã® 8ããããæ ¼ç´ãããã®ã§ãé
åã«ã¯ 1 ãå
¥ãã¾ãã:
ãã¢ã§ã:
let uint8array = new Uint8Array(16);
let num = 256;
alert(num.toString(2)); // 100000000 (äºé²è¡¨ç¾)
uint8array[0] = 256;
uint8array[1] = 257;
alert(uint8array[0]); // 0
alert(uint8array[1]); // 1
Uint8ClampedArray ã¯ãã®ç¹ã§ç¹å¥ã§ç°ãªãæ¯ãèãããã¾ããããã¯ã255 ããã大ããªå¤ã®å ´å㯠255 ããè² ã®å¤ã®å ´åã«ã¯ 0 ãæ ¼ç´ãã¾ããããã¯ç»åå¦çã®å ´åã«å½¹ç«ã¤æ¯ãèãã§ãã
TypedArray ã¡ã½ãã
TypedArray ã¯é常㮠Array ã®ã¡ã½ãããæã£ã¦ãã¾ãããæ³¨ç®ãã¹ãä¾å¤ãããã¾ãã
map, slice, find, reduce çã使ç¨ãã¦ã¤ãã¬ã¼ããããã¨ãã§ãã¾ãã
ã§ãããã§ããªããã¨ãããã¤ãããã¾ã:
spliceã¯ããã¾ãããåä»ãé å㯠buffer ã®ãã¥ã¼ã§ããããããã¯åºå®ãããé£ç¶ããã¡ã¢ãªé åã§ãããããå¤ã âåé¤â ãããã¨ã¯ã§ãã¾ãããã§ãããã¨ã¯ãã¼ãã®ä»£å ¥ã§ããconcatã¡ã½ããã¯ããã¾ããã
2ã¤ã®è¿½å ã®ã¡ã½ãããããã¾ã:
arr.set(fromArr, [offset])ã¯fromArrã®ãã¹ã¦ã®è¦ç´ ãarrã¸ãä½ç½®offset(ããã©ã«ã㯠0) ãéå§ç¹ã¨ãã¦ã³ãã¼ãã¾ããarr.subarray([begin, end])ã¯beginããend(æä»ç)ã¾ã§ã®åãåã®ãã¥ã¼ã使ãã¾ããããã¯sliceã¡ã½ããã«ä¼¼ã¦ãã¾ã(ãã®ã¡ã½ããããµãã¼ãããã¦ãã¾ã)ããä½ãã³ãã¼ãã¾ãããåã«æå®ããããã¼ã¿ç¯å²ãæä½ããããã®æ°ãããã¥ã¼ã使ããã ãã§ãã
ãããã®ã¡ã½ããã«ãããåä»ãé åã®ã³ãã¼ããããããã¯ã¹ããããæ¢åã®é åããæ°ããé åã使ããããããã¨ãã§ãã¾ãã
DataView
DataView ã¯éå¸¸ã«æè»ãª ArrayBuffer ã«å¯¾ãã âåæå®ã®ãªãâ ãã¥ã¼ã§ãããããããã©ã¼ãããã®ä»»æã®ãªãã»ããã®ãã¼ã¿ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
- åä»ãé
åã®å ´åãã³ã³ã¹ãã©ã¯ã¿ã¯ãã©ã¼ããããä½ã§ããããæ±ºå®ãã¾ããé
åå
¨ä½ã¯ä¸å¤ã«ãªãã¾ããi çªç®ã®æ°å¤ã¯
arr[i]ã§ãã DataViewã§ã¯ã.getUint8(i)ã.getUint16(i)ã¡ã½ããã§ãã¼ã¿ã«ã¢ã¯ã»ã¹ãã¾ãããã©ã¼ãããã¯ã³ã³ã¹ãã©ã¯ã¿æã®ä»£ããã«ãã¡ã½ããå¼ã³åºãæã«æå®ãã¾ãã
æ§æ:
new DataView(buffer, [byteOffset], [byteLength])
bufferâ åºç¤ã¨ãªãArrayBufferã§ããåä»ãé åã¨ã¯ç°ãªããDataViewã¯ããèªèº«ã§ã¯ buffer ã¯ä½æãã¾ãããäºåã«ç¨æããå¿ è¦ãããã¾ããbyteOffsetâ ãã¥ã¼ã®éå§ãã¤ãä½ç½®(ããã©ã«ã㯠0)ã§ããbyteLengthâ ãã¥ã¼ã®ãã¤ãé·(ããã©ã«ãã¯bufferã®æå¾ã¾ã§)ã§ãã
ä¾ãã°ãããã§ã¯åããããã¡ããç°ãªããã©ã¼ãããã§æ°å¤ãåãåºãã¾ãã:
let buffer = new Uint8Array([255, 255, 255, 255]).buffer;
let dataView = new DataView(buffer);
// ãªãã»ãã 0 ã§ã8ãããã®æ°å¤ãåå¾ãã¾ã
alert( dataView.getUint8(0) ); // 255
// ãªãã»ãã 0 ã§ã16ãããã®æ°å¤ãåå¾ãã¾ããã¤ã¾ã 2ãã¤ãã§ã
alert( dataView.getUint16(0) ); // 65535 (16ããã符å·ãªãæ´æ°ã®æå¤§å¤)
// ãªãã»ãã 0 ã§ã32ãããã®æ°å¤ãåå¾ãã¾ã
alert( dataView.getUint32(0) ); // 4294967295 (32ããã符å·ãªãæ´æ°ã®æå¤§å¤)
dataView.setUint32(0, 0); // 4ãã¤ãã®æ°å¤ã 0 ã«ã»ãã
DataView ã¯ãã©ã¼ããããæ··å¨ãããã¼ã¿ãåããããã¡ã«æ ¼ç´ããã¨ãã«å½¹ç«ã¡ã¾ããE.g ä¸é£ã®ãã¢(16ãããæ´æ°ã32ããã float)ãæ ¼ç´ãã¾ãããã®å¾ãDataView ã¯ç°¡åã«ãããã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
ãµããª
ArrayBuffer ã¯åºæ¬ã¨ãªããªãã¸ã§ã¯ãã§ãåºå®é·ã®é£ç¶ããã¡ã¢ãªé åã¸ã®åç
§ã§ãã
ArrayBuffer ã«å¯¾ããã»ã¨ãã©ã®æä½ã¯ã次ã®ãã¥ã¼ãå¿
è¦ã§ãã
TypedArray:Uint8Array,Uint16Array,Uint32Arrayâ 8, 16 ããã㯠32 ãããã®ç¬¦å·ãªãæ´æ°ã®å ´åUint8ClampedArrayâ 8 ãããæ´æ°ã®å ´åãä»£å ¥æã« âã¯ã©ã³ãâ ãã¾ãInt8Array,Int16Array,Int32Arrayâ 符å·ããæ´æ°å¤ã®å ´å(è² ã®å¤ããã)Float32Array,Float64Arrayâ 32, 64 ããã符å·ããæµ®åå°æ°ç¹
- ãããã¯
DataViewâ ãã©ã¼ããããæå®ããã¡ã½ããã使ç¨ãããã¥ã¼ã§ããä¾ãã°ãgetUint8(offset).
å¤ãã®å ´åãArrayBuffer ãé ããã¾ã¾ãç´æ¥åä»ãé
åã使ãæä½ãã¾ãã.buffer ã§ã¢ã¯ã»ã¹ãããã¨ãã§ããå¿
è¦ã«å¿ãã¦å¥ã®ãã¥ã¼ã使ãããã¨ãã§ãã¾ãã
ãã®ä»ã«2ã¤ã®ç¨èªãããã¾ã:
ArrayBufferViewã¯ããããã¹ã¦ã®ç¨®é¡ã®ãã¥ã¼ã®ç·ç§°ã§ããBufferSourceã¯ArrayBufferãããã¯ArrayBufferViewã®ç·ç§°ã§ãã
ãããã¯ãã¤ããªãã¼ã¿ãæä½ããã¡ã½ããã®èª¬æã§ä½¿ç¨ããã¦ãã¾ããBufferSource ã¯æãä¸è¬çãªç¨èªã§ãâãããã種é¡ã®ãã¤ããªãã¼ã¿â â ArrayBuffer ã¾ãã¯ãããè¦ããã¥ã¼ããæå³ãã¾ãã
ãã¼ãã·ã¼ãã§ã:
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã