💡前端入门:二进制在前端如何应用?从基础到实战全解析!

当你在前端页面上传一张图片、播放一段视频,或是处理从后端传来的加密数据时,有没有想过这些操作背后都离不开同一种 底层语言(二进制)

1.1、最基本的二进制对象(ArrayBuffer)

ArrayBuffer 简单说是一片内存,但是你不能直接用它

单位: 字节 (八比特)

js 复制代码
let buffer = new ArrayBuffer(16); // 创建一个长度为 16字节的数据

1.1.1、读ArrayBuffer(TypedArray)

如果我们要写入值或遍历ArrayBuffer,基本上几乎所有操作 ------ 我们必须使用TypedArray

  • Uint8Array ------ 将 ArrayBuffer 中的每个字节视为 0 到 255 之间的单个数字(每个字节是 8 位,因此只能容纳那么多)。这称为 "8 位无符号整数"。
  • Uint16Array ------ 将每 2 个字节视为一个 0 到 65535 之间的整数。这称为 "16 位无符号整数"。
  • Uint32Array ------ 将每 4 个字节视为一个 0 到 4294967295 之间的整数。这称为 "32 位无符号整数"。
  • Float64Array ------ 将每 8 个字节视为一个 5.0x10-324 到 1.8x10308 之间的浮点数。
js 复制代码
let buffer = new ArrayBuffer(4); // 创建一个长度为 4字节的数据
let view = new Uint8Array(buffer); 
view[0] = 63;
view[1] = 65;
for(let num of view) {
    console.log(num); //63  65  0   0
  }

1.1.2、二进制转字符串

js 复制代码
let uint8Array = new Uint8Array([72, 101, 108, 108, 111]);
alert( new TextDecoder().decode(uint8Array) ); // Hello

2、blob

二进制是数据的本体,BLOB 是操作这种数据的工具。就像"水"和"杯子"的关系:水(二进制)是本质,杯子(BLOB)是方便你携带和使用的容器。

2.1、blob属性

  • Blob.size 只读

    Blob 对象中所包含数据的大小(字节)。

  • Blob.type 只读

    一个字符串,表明该 Blob 对象所包含数据的 MIME 类型。如果类型未知,则该值为空字符串。

2.2、实例方法

  • Blob.arrayBuffer():返回一个 promise,其会兑现一个包含 Blob 所有内容的二进制格式的 ArrayBuffer

  • Blob.bytes():返回一个 promise,其会兑现一个包含 Blob 内容的 Uint8Array

  • Blob.text():返回一个 promise,其会兑现一个包含 Blob 所有内容的 UTF-8 格式的字符串。

js 复制代码
    <input type="file" onchange="showFile(this)" />
    <script>
      async function showFile(input) {
        let file = input.files[0];
        file.arrayBuffer().then((res) => console.log(res));
      }
    </script>
  • Blob.slice():返回一个新的 Blob 对象,其中包含调用它的 blob 的指定字节范围内的数据。
  • Blob.stream():返回一个能读取 Blob 内容的 ReadableStream
js 复制代码
  <input type="file" onchange="showFile(this)" />
  <script>
    async function showFile(input) {
        let file = input.files[0];
        const readableStream = file.stream();
        const stream = readableStream.getReader();
        while (true) {
          const { done, value } = await stream.read();
          if (done) {
            console.log("all blob processed.");
            break;
          }
          console.log(value);
        }
    }
  </script>

2.3、blob创建URL

可以在浏览器F12中运行这段代码

js 复制代码
let link = document.createElement('a');
link.download = 'hello.txt';
let blob = new Blob(['Hello, world!'], {type: 'text/plain'});
link.href = URL.createObjectURL(blob);
link.click();
URL.revokeObjectURL(link.href);

2.4、Blob 转换为 base64

可以在浏览器F12中运行这段代码

js 复制代码
let link = document.createElement('a');
link.download = 'hello.txt';
let blob = new Blob(['Hello, world!'], {type: 'text/plain'});
let reader = new FileReader();
reader.readAsDataURL(blob); // 将 Blob 转换为 base64 并调用 onload
reader.onload = function() {
  link.href = reader.result; // data url
  link.click();
};

2.5、Image 转换为 blob

js 复制代码
<img
      src="data:image/png;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7"
    />
      <script>
      let img = document.querySelector("img");
      // 生成同尺寸的 <canvas>
      let canvas = document.createElement("canvas");
      canvas.width = img.clientWidth;
      canvas.height = img.clientHeight;
      let context = canvas.getContext("2d");
      // 向其中复制图像(此方法允许剪裁图像)
      context.drawImage(img, 0, 0);
      // 我们 context.rotate(),并在 canvas 上做很多其他事情
      // toBlob 是异步操作,结束后会调用 callback
      canvas.toBlob(function (blob) {
        // blob 创建完成,下载它
        let link = document.createElement("a");
        link.download = "example.png";
        link.href = URL.createObjectURL(blob);
        link.click();
        //
        删除内部 blob 引用,这样浏览器可以从内存中将其清除
        URL.revokeObjectURL(link.href);
      }, "image/png");
    </script>

2.6、Bolb的扩展(File对象)

File 对象继承自 Blob,只比bolb多两个属性

  • name ------ 文件名,
  • lastModified ------ 最后一次修改的时间戳。
js 复制代码
<input type="file" onchange="showFile(this)">
<script>
function showFile(input) {
  let file = input.files[0];
}
</script>

3.读bolb数据

FileReader 是一个对象,其唯一目的是从 Blob对象中读取数据。

主要方法:

  • readAsArrayBuffer(blob) ------ 将数据读取为二进制格式的 ArrayBuffer。
  • readAsText(blob, [encoding]) ------ 将数据读取为给定编码(默认为 utf-8 编码)的文本字符串。
  • readAsDataURL(blob) ------ 读取二进制数据,并将其编码为 base64 的 data url。

读取过程中,有以下事件:

  • load ------ 读取完成,没有 error。
  • error ------ 出现 error。

读取完成后,我们可以通过以下方式访问读取结果:

  • reader.result 是结果(如果成功)
  • reader.error 是 error(如果失败)。
js 复制代码
<input type="file" onchange="readFile(this)">

<script>
function readFile(input) {
  let file = input.files[0];
  let reader = new FileReader();
  reader.readAsText(file);
  reader.onload = function() {
    console.log(reader.result);
  };
  reader.onerror = function() {
    console.log(reader.error);
  };
}
</script>
相关推荐
用户461169657283 分钟前
网站 HTTPS 不稳定?证书排查指南
前端
n876515 分钟前
Playwright Java WEB UI 自动化实现框架与逻辑
java·前端·ui
keyipatience17 分钟前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
xifangge20251 小时前
基于 JavaScript 实现 CNC 数控切削参数与螺纹公差纯前端核算引擎
开发语言·前端·javascript
wangruofeng1 小时前
2026 Web 技术选型指南,AI 时代如何选择适合项目的技术栈
前端·aigc·ai编程
honkun61 小时前
vue 表格组件 vxe-table 修改滚动条样式,修改滚动条样式,统一宽度、颜色与自动隐藏
前端·javascript·vue.js
爱勇宝2 小时前
研究数字孪生的这半年,做了个 Demo,也有了一些新想法
前端·程序员
不可能片场2 小时前
工程实践 一个缓存把选片从十分钟压到一分钟
前端·electron
前端小万2 小时前
探索副业五个月,最终以放弃告终
前端·后端·面试
FRing032 小时前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式