如何在 Javascript 中创建包含任意八位字节的 blob

How to create a blob containing an arbitrary octet in Javascript

我试图了解如何使用 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,这是 '1' 的 UTF-8 字符编码。我知道因为 javascript 是弱类型的,所以所有数字都表示为 64 位浮点数,所以如果我有一个大的 64 位序列,我会理解的。或者,如果我将 MIME 类型指定为 'text/plain' 而不是 'octet/stream' 并获得 UTF-8 编码输出,我就会理解。

然而,就目前而言,我不知所措......我什至尝试了一些变体,我改变了被送入 Blob 构造函数的数组。我尝试了 [0x1] 而不是 [1]。同样的结果。我试过 [0b00000001]。相同的结果。

所以。我做错了什么以及如何在客户端 javascript 中创建字节级文件?这是我使用 Blob 构造函数的方式的问题,还是与我用来从浏览器中获取 Blob 的 URL 编码有关?任何帮助将不胜感激

Blob() 构造函数需要 Blob-partsArrayBufferUSVStrings[= 的可能混合列表50=].

  • Blob-parts 是其他 Blob 对象。
  • ArrayBuffer 要么是 ArrayBuffer 对象,要么是您将传入列表的 TypedArray 的 .buffer 属性。
  • 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();