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

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

Жанры

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

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

Варвара Асенкова

Алянский Юрий Лазаревич
Корифеи русской и зарубежной сцены
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Варвара Асенкова

Государь

Кулаков Алексей Иванович
3. Рюрикова кровь
Фантастика:
мистика
альтернативная история
историческое фэнтези
6.25
рейтинг книги
Государь

Газлайтер. Том 22

Володин Григорий Григорьевич
22. История Телепата
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Газлайтер. Том 22

Меняя маски

Метельский Николай Александрович
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
Меняя маски

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Моров. Том 4

Кощеев Владимир
3. Моров
Фантастика:
фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 4

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Страх

Рыбаков Анатолий Наумович
2. Дети Арбата
Проза:
историческая проза
9.49
рейтинг книги
Страх

Инженер Петра Великого 2

Гросов Виктор
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Инженер Петра Великого 2

Черта прикрытия

Бэнкс Иэн М.
9. Культура
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
6.67
рейтинг книги
Черта прикрытия

Газлайтер. Том 18

Володин Григорий Григорьевич
18. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 18

Афганский рубеж 2

Дорин Михаил
2. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Афганский рубеж 2