Как создать BLOB-объект, содержащий произвольный октет в Javascript - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь понять, как объект Blob можно использовать для программного создания двоичных файлов на уровне байтов в клиентском JavaScript.Как способ накопить знания, как я пытаюсь создать однобайтовый BLOB-объект, содержащий следующий октет: 00000001. Просто так?К сожалению, я не смог понять, как это сделать.Ниже приведена первая итерация моего кода:

let downloadButton = document.getElementById('downloadButton');
downloadButton.addEventListener('click', function(){
  var myBlob = new Blob([1], {type : "octet/stream"});
  url = window.URL.createObjectURL(myBlob);
  let a = document.createElement('A');
  a.href = url;
  a.download = "testFileOctet";
  a.click();
});

Я не удивлен, что это не приводит к желаемой последовательности битов «00000001» при просмотре в шестнадцатеричном редакторе.Я, однако, удивлен, что он выводит 00110001, который является кодировкой UTF-8 '1'.Я знаю, что из-за слабой типизации javascript все числа представлены в виде 64-разрядных чисел с плавающей запятой, поэтому я бы понял, если бы у меня была большая 64-разрядная последовательность.Или я бы понял, если бы я указал тип MIME как «text / plain» вместо «octet / stream» и получил вывод кодировки UTF-8.

Как бы то ни было, однако, я в растерянности ... Я даже пытался сделать несколько изменений, когда я изменил массив, подаваемый в конструктор Blob.Вместо [1] я попытался [0x1].Тот же результат.Я пытался [0b00000001].Тот же результат.

Итак.Что я делаю не так и как возможно создание файла на уровне байтов в клиентском JavaScript?Это проблема с тем, как я использую конструктор Blob, или это возможно связано с кодировкой URL, которую я использую, чтобы получить Blob из браузера?Любая помощь будет высоко ценится

1 Ответ

0 голосов
/ 10 октября 2018

Конструктор Blob () ожидает, возможно, смешанный список из Blob-частей , ArrayBuffer или USVStrings .

  • Blob-части - другие объекты Blob.
  • ArrayBuffer являются либо объектами ArrayBuffer, либо свойством .buffer TypedArray, которое вы передадите в список.
  • USVStrings больше похожи на строки UTF-8.

В вашем случае, new Blob([1]), число 1,будучи ни Blob, ни ArrayBuffer, ни TypedArray не будет принудительно приведен к USVString "1".

Так же, как если бы вы вызывали new Blob([{}]), буквальный объект был бы приведен к USVString "[object Object]".

const obj = new Blob([{}]);
new Response(obj).text().then(v=>console.log('obj', v));

const one = new Blob([1]);
new Response(one).text().then(v=>console.log('one', v));

Итак, как мы устанавливаем произвольные байты?

Мы используем ArrayBuffer и различные виды на него.

const buf = new ArrayBuffer(1);
const view = new Uint8Array(buf);
view[0] = 1;
const blob = new Blob([buf]);
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'one.bin';
document.body.append(a);
a.click();
...