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

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

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

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

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

<b>var little_endian = new Int8Array(new Int32Array([1]).buffer)[0] === 1;</b>

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

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

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

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

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

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

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

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

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

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

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

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

Класс

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

Класс

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

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

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

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

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

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

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

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

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

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

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

Сами по себе двоичные объекты не представляют особого интереса, но они служат важным механизмом обмена данными для некоторых прикладных интерфейсов в языке JavaScript, которые работают с двоичными данными. На рис. 22.2 показано, как можно обмениваться двоичными объектами во Всемирной паутине, читать и сохранять их в локальной файловой системе, в локальных базах данных и даже обмениваться ими с другими окнами и фоновыми потоками выполнения. Он также показывает, как можно получить содержимое двоичного объекта в виде текста, типизированного массива или URL-адреса.