Подтвердить что ты не робот

В чем разница между ArrayBuffer и Blob?

Я читаю http://www.html5rocks.com/en/tutorials/file/xhr2/ и пытается выяснить разницу между ArrayBuffer и Blob.

Разве оба контейнера не состоят из битов? Следовательно, оба контейнера не могли быть просмотрены многими способами (как 32-битные куски, 16-битные куски и т.д.)?

4b9b3361

Ответ 1

Это объясняется на странице.

ArrayBuffer

ArrayBuffer представляет собой общий контейнер фиксированной длины для двоичных данных. Они очень удобны, если вам нужен обобщенный буфер необработанных данных, , но реальная сила, стоящая за этими ребятами, заключается в том, что вы можете создавать "представления" базовых данных с использованием массивов с набором символов. Фактически, несколько представлений могут быть созданы из одного источника ArrayBuffer. Например, вы можете создать 8-разрядный целочисленный массив, который имеет тот же массив ArrayBuffer, что и существующий 32-разрядный целочисленный массив из одних и тех же данных. Основные данные остаются неизменными, мы просто создаем разные представления.

BLOB

Если вы хотите работать непосредственно с Blob и/или не нужно манипулировать ни одним из байтов файла, используйте xhr.responseType = 'blob':

Ответ 2

Резюме

Если вам не нужна возможность писать/редактировать (используя ArrayBuffer), то формат Blob, вероятно, будет лучшим.

Деталь

Я пришел к этому вопросу со другой страницы html5rocks. и обнаружил, что @Bart van Heukelom комментарии полезны, поэтому я хотел поднять их до ответа здесь.

Я также нашел полезным найти ресурсы, специфичные для объектов ArrayBuffer и Blob. Я добавил акцент, чтобы повторить полезную деталь, которую я искал. Итак, несмотря на то, что Blob делает акцент на "необработанных данных", он очень работоспособен.

Некоторые другие моменты на ArrayBuffer против Blob:

  • переменчивость
    • ArrayBuffer можно изменить (например, с помощью DataView)
    • BLOB-объект неизменен
  • Источник
    • Цитирую Барта ван Хейкелом:
      • ArrayBuffer находится в памяти, доступен для манипуляций.
      • Большой двоичный объект может находиться на диске, в кэш-памяти и других местах , недоступных
  • Уровень доступа
    • ArrayBuffer потребуется некоторый слой доступа, например, типизированные массивы
    • BLOB-объекты могут быть переданы непосредственно в другие функции, такие как window.URL.createObjectURL, как показано в примере из OP URL.
    • Однако, как указывает Мёрре, вам все равно могут понадобиться API-интерфейсы, связанные с файлами, такие как FileReader, для работы с BLOB-объектами.
  • Перерабатывать
  • Использование в других библиотеках
    • jsZip; (new JSZip()).loadAsync(...) принимает как ArrayBuffer, так и Blob: String/Array of bytes/ArrayBuffer/Uint8Array/Buffer/Blob/Promise

Вот подробности документации, которые мне помогли:

Вот ArrayBuffer

Объект ArrayBuffer используется для представления универсальной фиксированной длины Буфер необработанных двоичных данных. Вы не можете напрямую манипулировать содержимым ArrayBuffer; вместо этого вы создаете один из объектов типизированного массива или объект DataView, который представляет буфер в определенном формате, и используйте это для чтения и записи содержимого буфера.

Вот Blob

Объект Blob представляет файловый объект из неизменяемого, необработанных данных. BLOB-объекты представляют данные, которые не обязательно являются родными для JavaScript формат. Файловый интерфейс основан на Blob, наследующем BLOB функциональность и расширение его для поддержки файлов в пользовательской системе.