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

на главную - закладки

Жанры

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

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. Поскольку двоичные объекты могут иметь огромный размер и для работы с ними может потребоваться доступ к диску, прикладные интерфейсы для работы с ними действуют асинхронно (имеются также синхронные версии для использования в фоновых потоках выполнения).

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

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Турнир

Скиба Николай
7. Зверолов
Фантастика:
фэнтези
рпг
уся
фантастика: прочее
попаданцы
6.00
рейтинг книги
Турнир

Чай и водка в истории России

Похлебкин Вильям Васильевич
Дом и Семья:
кулинария
6.25
рейтинг книги
Чай и водка в истории России

Деспот

Арская Арина
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Деспот

Странники

Измайлова Кира Алиевна
Фантастика:
фэнтези
юмористическая фантастика
8.77
рейтинг книги
Странники

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия

За миллиард лет до конца света (сборник)

Стругацкие Аркадий и Борис
Фантастика:
научная фантастика
8.45
рейтинг книги
За миллиард лет до конца света (сборник)

Достоевский

Гроссман Леонид Петрович
357. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Достоевский

Законник Российской Империи

Ткачев Андрей Юрьевич
1. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Законник Российской Империи

Первый среди равных. Книга IX

Бор Жорж
9. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IX

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
Наша навсегда

Большая Советская Энциклопедия (РЫ)

Большая Советская Энциклопедия
Справочная литература:
энциклопедии
5.00
рейтинг книги
Большая Советская Энциклопедия (РЫ)

Гуманитарное знание и вызовы времени

Коллектив авторов
Humanitas
Научно-образовательная:
культурология
5.00
рейтинг книги
Гуманитарное знание и вызовы времени

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X