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

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

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-3241.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>
相关推荐
IT_陈寒4 分钟前
Redis 性能优化实战:5个被低估的配置项让我节省了40%内存成本
前端·人工智能·后端
chilavert3185 分钟前
技术演进中的开发沉思-261 Ajax:动画优化
前端·javascript·ajax
尘心cx8 分钟前
前端-APIs-day3
开发语言·前端·javascript
烂不烂问厨房22 分钟前
前端自适应布局之等比例缩放
开发语言·前端·javascript
kong790692832 分钟前
环境搭建-运行前端工程
前端
CodeLinghu35 分钟前
提示词链模式:一种利用LLM大语言模型处理复杂任务的强大范式
前端·人工智能·语言模型
J2虾虾44 分钟前
关于Ant Design Vue
前端·javascript·vue.js
程序员笨鸟1 小时前
[特殊字符] React 高频 useEffect 导致页面崩溃的真实案例:从根因排查到彻底优化
前端·javascript·学习·react.js·面试·前端框架
Highcharts.js1 小时前
从旧版到新版:Highcharts for React 迁移全攻略 + 开发者必知的 5 大坑
前端·react.js·前端框架·编辑器·highcharts
独角鲸网络安全实验室1 小时前
高危预警!React核心组件曝CVSS 9.8漏洞,数百万开发者面临远程代码执行风险
运维·前端·react.js·网络安全·企业安全·漏洞·cve-2025-11953