Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

last3.buffer // => вернет объект ArrayBuffer

last3.buffer == ints.buffer // => true: оба - представления одного буфера

last3.byteOffset // => 14: это представление начинается с 14-го байта в буфере

last3.byteLength // => 6: размер представления 6 байт (3 16-битных целых)

Сам объект

ArrayBuffer
имеет только одно свойство, возвращающее его длину:

last3.byteLength // => 6: размер представления 6 байт

last3.buffer.byteLength // => 20: но буфер имеет размер 20 байт

Типизированные массивы, элемент <canvas> и базовый JavaScript

Типизированные массивы являются важной частью прикладного интерфейса создания трехмерной графики WebGL в элементе <canvas>, и в броузерах они реализованы как часть прикладного интерфейса WebGL. WebGL не рассматривается в этой книге, но типизированные массивы весьма полезны сами по себе, и поэтому обсуждаются здесь. В главе 21 говорилось, что прикладной интерфейс объекта Canvas определяет метод getlmageData, возвращающий объект ImageData. Свойство data объекта ImageData является массивом байтов. В спецификации HTML он называется CanvasPixelArray, но, по сути, это то же самое, что описываемый здесь Uint8Array, за исключением способа обработки значений, выходящих за диапазон 0-255.

Имейте в виду, что эти типы не являются частью базового языка. Будущие версии языка JavaScript, возможно, будут включать поддержку типизированных массивов, подобных этим, но на момент написания этих строк еще было неясно, примет ли язык прикладной интерфейс, описываемый здесь, или будет создан новый прикладной интерфейс.

*****************************************************

Объект

АгrayВuffers
– это всего лишь последовательность байтов. К этим байтам можно обращаться с помощью типизированных массивов, но сам объект
ArrayBuffer
не является типизированным массивом. Однако будьте внимательны: объект
ArrayBuffer
можно индексировать числами, как любой другой объект JavaScript, но это не обеспечивает доступ к байтам в буфере:

var bytes = new Uint8Array(8); // Разместить 8 байтов

bytes[0] =1; // Записать в первый байт значение 1

bytes.buffer[0] // => undefined: буфер не имеет индекса 0

bytes.buffer[1] = 255; // Попробовать некорректно записать значение в байт буфера

bytes.buffer[1] // => 255: это обычное JavaScript-свойство

bytes[1] // => 0: строка выше не изменила байт

Имеется возможность создавать объекты

ArrayBuffer
непосредственно, вызовом конструктора
ArrayBuffer,
и на основе имеющегося объекта
ArrayBuffer
можно создать любое число представлений типизированного массива:

var buf = new ArrayBuffeг(1024*1024); // Один Мбайт

var asbytes = new Uint8Array(buf); // Представление в виде байтов

var asints = new Int32Array(buf); // В виде 32-битных целых со знаком

var lastK = new Uint8Array(buf,1023*1024); // Последний Кбайт в виде байтов

var ints2 = new Int32Array(buf, 1024, 256); // 2-й Кбайт в виде 256 целых чисел

Типизированные массивы позволяют представлять одну и ту же последовательность байтов в виде целых чисел размером 8, 16, 32 или 64 бита. Это поднимает проблему «порядка следования байтов», т. е. порядка, в каком следуют байты при объединении в более длинные слова. Для эффективности типизированные массивы используют порядок следования байтов, определяемый аппаратным обеспечением. В системах с обратным порядком следования байтов байты числа располагаются в буфере

ArrayBuffer
в порядке от младшего к старшему. На платформах с прямым порядком следования байтов байты располагаются в порядке от старшего к младшему. Определить порядок следования байтов на текущей платформе, где выполняется сценарий, можно следующим образом:

// Если целое число 0x00000001 располагается в памяти в виде

// последовательности байтов 01 00 00 00, следовательно, сценарий выполняется

// на платформе с обратным порядком следования байтов. На платформе с прямым

// порядком следования байтов мы получим байты 00 00 00 01.

var little_endian = new Int8Array(new Int32Array([1]).buffer)[0] === 1;

В настоящее время наибольшее распространение получили процессорные архитектуры с обратным порядком следования байтов. Однако многие сетевые протоколы и некоторые двоичные форматы файлов требуют, чтобы байты следовали в прямом порядке. В разделе 22.6 вы узнаете, как использовать объекты

ArrayBuffer
для хранения байтов, прочитанных из файлов или полученных из сети. В подобных ситуациях нельзя просто полагаться на то, что порядок следования байтов, поддерживаемый аппаратной частью, совпадает с порядком следования байтов в данных. Вообще, при работе с внешними данными, для представления данных в виде массива отдельных байтов можно использовать
Int8Array
и
Uint8Array
, но нельзя использовать другие виды типизированных массивов для представления данных в виде массивов многобайтовых слов. Вместо этого можно использовать класс
DataView
, который определяет методы чтения и записи значений из буфера
ArrayBuffer
, использующие явно указанный порядок следования байтов:

  • Читать дальше
  • 1
  • ...
  • 448
  • 449
  • 450
  • 451
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • 458
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: