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

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

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>
相关推荐
阿芯爱编程4 分钟前
2025前端面试题
前端·面试
前端小趴菜051 小时前
React - createPortal
前端·vue.js·react.js
晓13132 小时前
JavaScript加强篇——第四章 日期对象与DOM节点(基础)
开发语言·前端·javascript
菜包eo2 小时前
如何设置直播间的观看门槛,让直播间安全有效地运行?
前端·安全·音视频
烛阴2 小时前
JavaScript函数参数完全指南:从基础到高级技巧,一网打尽!
前端·javascript
chao_7893 小时前
frame 与新窗口切换操作【selenium 】
前端·javascript·css·selenium·测试工具·自动化·html
天蓝色的鱼鱼4 小时前
从零实现浏览器摄像头控制与视频录制:基于原生 JavaScript 的完整指南
前端·javascript
三原4 小时前
7000块帮朋友做了2个小程序加一个后台管理系统,值不值?
前端·vue.js·微信小程序
popoxf4 小时前
在新版本的微信开发者工具中使用npm包
前端·npm·node.js
爱编程的喵5 小时前
React Router Dom 初步:从传统路由到现代前端导航
前端·react.js