Чтение онлайн

ЖАНРЫ

JavaScript. Подробное руководство, 6-е издание
Шрифт:

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
, использующие явно указанный порядок следования байтов:

var data; // Предположим, что данные в ArrayBuffer получены из сети

var view = DataView(data); // Создать представление буфера

var int = view.getlnt32(0); // 32-битное* целое со знаком с прямым порядком

// следования байтов, начиная
с 0-го байта

int = view.getInt32(4,false); // Следующее 32-битное целое, также с прямым

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

int = view.getInt32(8,true) // Следующие 4 байта как целое со знаком

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

view.setInt32(8,int,false); // Записать его обратно, в формате с прямым

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

Класс

DataView
определяет восемь методов get для каждого из восьми видов типизированных массивов. Они имеют такие имена, как
getlnt16, getUint32
и
getFloat64
. В первом аргументе они принимают смещение значения в байтах в буфере
ArrayBuffer
. Все эти методы чтения, кроме
getlnt8
и
getUint8,
принимают логическое значение во втором необязательном аргументе. Если второй аргумент отсутствует или имеет значение false, используется прямой порядок следования байтов. Если второй аргумент имеет значение true, используется обратный порядок следования байтов.

Класс

DataView
определяет восемь соответствующих методов
set
, которые записывают значения в буфер
ArrayBuffer
. В первом аргументе этим методам передается смещение начала значения. Во втором аргументе - записываемое значение. Все методы, кроме
setlnt8
и
setUint8,
принимают необязательный третий аргумент. Если аргумент отсутствует или имеет значение false, значение записывается в формате с прямым порядком следования байтов, когда первым следует старший байт. Если аргумент имеет значение true, значение записывается в формате с обратным порядком следования байтов, когда первым записывается младший байт.

22.6. Двоичные объекты

Двоичный объект (

Blob
) - это нетипизированная ссылка, или дескриптор, блока данных. Название «Blob» пришло из мира баз данных SQL, где оно расшифровывается как «Binary Large Object» (большой двоичный объект). В языке JavaScript двоичные объекты часто представляют двоичные данные, и они могут иметь большой размер, но это совсем необязательно: двоичный объект
Blob
может также представлять содержимое небольшого текстового файла. Двоичные объекты непрозрачны, т. е. являются своего рода черными ящиками: все, что можно с ними сделать, - это определить их размер в байтах, узнать MIME-тип и разбить на более мелкие двоичные объекты:

var blob = ... // Как получить двоичный объект, будет показано ниже

blob.size // Размер двоичного объекта в байтах

blob.type // МІМЕ-тип двоичного объекта или если неизвестен

var subblob = blob.slice(0,1024, "text/plain"); // Первый килобайт - как текст

var last = blob.slice(blob.size-1024, 1024); // Последний килобайт -

// как нетипизированные данные

Веб-броузеры могут сохранять двоичные объекты в памяти или на диске, и двоичные объекты могут представлять действительно огромные блоки данных (такие как видеофайлы), которые слишком велики, чтобы их можно было уместить в памяти, предварительно не разбив на более мелкие части с помощью метода slice. Поскольку двоичные объекты могут иметь огромный размер и для работы с ними может потребоваться доступ к диску, прикладные интерфейсы для работы с ними действуют асинхронно (имеются также синхронные версии для использования в фоновых потоках выполнения).

Поделиться с друзьями: