Uint16Массив доступа byteOffset 1, 3, 5 и т. Д. - PullRequest
2 голосов
/ 10 декабря 2011
new Uint16Array(ArrayBuffer, byteOffset, length);

Для Uint16 (слово) byteOffset может быть только 0, 2, 4, 6 и т. Д. Как получить доступ ко 2-му, 4-му байту?(byteOffset = 1, 3 и т. Д.) DataView - это решение для Chrome, но не для FireFox (вообще не знаю об опере).

1 Ответ

2 голосов
/ 10 декабря 2011

Вы можете преобразовать буфер в Uint8Array (для отдельных байтов), а затем прочитать из этого массива:

var a = new Uint16Array(10);

// fill `a` with data
for(var i = 0; i < 10; i++) a[i] = i * 10;

var b = new Uint8Array(a.buffer); // `b` contains bytes of `a`, e.g. use `b[1]`

var orig = new Uint8Array(buffer);

var sub = new Uint16Array(orig.subarray(1, 2)); // from index 1 to 2, so second byte

var word = sub[0]; // 2nd byte as Uint16

О вашем опубликованном случае:

var buf = new ArrayBuffer(65535);
var u8s = new Uint8Array(buf);
u8s[0] = 0x01;
u8s[1] = 0x02;
u8s[2] = 0x03;
var x = new Uint8Array(u8s.subarray(1, 3)).buffer; // buffer from subarray
                                                   // 1 to 3 because 1 word is 2 bytes
sub = new Uint16Array(x); // create Uint16Array from it
sub[0]; // 770, which is:   (3 << 8) | 2   (it is big-endian)
...