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

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

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_陈寒20 小时前
Python+AI实战:用LangChain构建智能问答系统的5个核心技巧
前端·人工智能·后端
袁煦丞20 小时前
MoneyPrinterTurbo一键生成短视频:cpolar内网穿透实验室第644个成功挑战
前端·程序员·远程工作
代码小学僧20 小时前
让 AI 真正帮你开发:前端 MCP 实用技巧分享
前端
晴殇i20 小时前
前端鉴权新时代:告别 localStorage,拥抱更安全的 JWT 存储方案
前端·javascript·面试
Json____20 小时前
使用node Express 框架框架开发一个前后端分离的二手交易平台项目。
java·前端·express
since �20 小时前
前端转Java,从0到1学习教程
java·前端·学习
小奋斗20 小时前
面试官:[1] == '1'和[1] == 1结果是什么?
前端·面试
萌萌哒草头将军20 小时前
尤雨溪宣布 oxfmt 即将发布!比 Prettier 快45倍 🚀🚀🚀
前端·webpack·vite
weixin_4050233720 小时前
webpack 学习
前端·学习·webpack
云中雾丽20 小时前
flutter中 Future 详细介绍
前端