前端也要学的“二进制”知识

Blob

Blob 全称是 Binary Large Object,二进制大型对象。

  • 可以用来存储二进制数据。
  • 不能修改。
  • 不能直接读取,只能通过 FileReader 读取。

构造函数

通过 Blob 构造函数创建。

typescript 复制代码
interface BlobPropertyBag {
  type?: string;
  endings?: "transparent" | "native";
}

type BlobPart = ArrayBufferView | ArrayBuffer | Blob | string;

interface BlobConstructor {
  new (blobParts?: BlobPart[], options?: BlobPropertyBag): Blob;
}

var Blob: BlobConstructor;
javascript 复制代码
const blob = new Blob(["wain"], {
  type: "text/plain",
});

参数

  1. blobParts(Array<ArrayBufferView | ArrayBuffer | Blob | string>): 初始源数据。
  2. options(BlobPropertyBag) :实例时的配置:
    • type(string): 媒体类型(MIME 类型)。
    • endings(string): 换行符的表示方式。

例子

javascript 复制代码
const textBlob = new Blob(["wain"], {
  type: "text/plain",
  endings: "transparent",
});

const arrayBuffer = new ArrayBuffer(8);
const arrayBufferBlob = new Blob([arrayBuffer], {
  type: "image/png",
  endings: "transparent",
});

创造实例

构造函数

javascript 复制代码
const textBlob = new Blob(["wain"], {
  type: "text/plain",
});

实例分割

javascript 复制代码
const textBlob = new Blob(["hello world"], {
  type: "text/plain",
});
const textBlob1 = textBlob.slice(0, 5);
const textBlob2 = textBlob.slice(6);

小细节

  • 不同的 type 的值并不会影响 blobParts 源数据。

File

FIle 继承 Blob,不仅仅拥有 Blob 的全部属性和方法,自身也多了一些属性和方法,可以更加详细的描述文件的信息,例如:文件名称、文件类型、文件大小、文件最后修改时间等。

  • 可以用来存储二进制数据。
  • 不能修改。
  • 不能直接读取,只能通过 FileReader 读取。

构造函数

通过 File 构造函数创建。

typescript 复制代码
interface BlobPropertyBag {
  type?: string;
  endings?: "transparent" | "native";
}

interface FilePropertyBag extends BlobPropertyBag {
  lastModified?: number;
}

type BlobPart = ArrayBufferView | ArrayBuffer | Blob | string;

interface FileConstructor {
  new (
    blobParts: BlobPart[],
    fileName: string,
    options?: BlobPropertyBag
  ): Blob;
}

var File: FileConstructor;

参数

  1. blobParts(Array<ArrayBufferView | ArrayBuffer | Blob | string>): 初始源数据。
  2. fileName(string): 文件名称。
  3. options(BlobPropertyBag) :实例时的配置:
    • type(string): 媒体类型(MIME 类型)。
    • lastModified(number): 最后修改时间,单位为毫秒。
    • endings(string): 换行符的表示方式。

例子

javascript 复制代码
const file = new File(["wain"], "text.txt", {
  type: "text/plain",
  lastModified: Date.now(),
  endings: "transparent",
});

创造实例

构造函数

javascript 复制代码
const textFile = new File(["file"], "text.txt", {
  type: "text/plain",
});

实例分割

javascript 复制代码
const textFile = new File(["file"], "text.txt", {
  type: "text/plain",
});
const textFile1 = textFile.slice(0, 4);
const textFile2 = textFile.slice(5);

输入框选择文件

html 复制代码
<input id="fileId" type="file"></input>
<script>
    const fileDom = document.getElementById("fileId");
    fileDom.type = "file";
    fileDom.onchange = (event) => {
        const files = event.target.files;
        console.log(files);
    };
</script>

拖拽选择上传

html 复制代码
<div
  id="fileId"
  style="width: 100px;height: 100px;background-color: #ccc;"
></div>
<script>
  const fileDom = document.getElementById("fileId");
  fileDom.addEventListener("dragover", (event) => {
    event.preventDefault();
  });
  fileDom.addEventListener("drop", (event) => {
    event.preventDefault();
    const files = event.dataTransfer.files;
    console.log(files);
  });
</script>

ArrayBuffer

ArrayBuffer 表示在内存中开辟的一段连续的二进制区域,所有字节内容都是 0

  • 内存是一段连续的二进制区域。
  • 字节内容都是 0
  • 不能直接读取和修改,需要通过 TypeViewDataView 进行读取和修改,

构造函数

通过 ArrayBuffer 构造函数创建。

typescript 复制代码
interface ArrayBufferConstructor {
  new (byteLength: number): ArrayBuffer;
}

var ArrayBuffer: ArrayBufferConstructor;

参数

  1. byteLength(number): 数组长度,单位为字节。

例子

javascript 复制代码
const arrayBuffer = new ArrayBuffer(8);

创造实例

构造函数

javascript 复制代码
const arrayBuffer = new ArrayBuffer(16);

FileBlob 实例转换为 ArrayBuffer

javascript 复制代码
const textFile = new File(["hello"], "text.txt", {
  type: "text/plain",
});
const render = new FileReader();
render.onload = function () {
  console.log(render.result);
};
render.readAsArrayBuffer(textFile);

Text 转为 ArrayBuffer

javascript 复制代码
const text = "hello";
const textArrayBuffer = new TextEncoder().encode(text);
console.log(textArrayBuffer);

读取器

DataView

DataView 是一种视图,用于读取和修改二进制数据。 包含Int8ArrayInt16ArrayInt32ArrayFloat32ArrayFloat64ArrayBigInt64ArrayBigUint64Array... 按照不同的字节长度划分不同的视图,每个视图的长度都是固定的。

  • 读取和修改二进制数据。
  • 内存中一串二进制数据的代理。
  • 每个视图的长度都是固定的。
javascript 复制代码
const arrayBuffer = new ArrayBuffer(5);
const int8Array = new Int8Array(arrayBuffer);
int8Array[0] = 104;
int8Array[1] = 101;

TypeView

TypeView 是一种视图,用于读取和修改二进制数据。不固定字节长度,可以使用不同方法读取和修改数据。 可以按照不同的字节序读取和修改数据,这也是和 DataView 读取器的主要区别。

  • 读取和修改二进制数据。
  • 内存中一串二进制数据的代理。
  • 通过不同方法读取和修改二进制数据。 可以按照不同的字节序读取和修改数据。
javascript 复制代码
const arrayBuffer = new ArrayBuffer(5);
const dataView = new DataView(arrayBuffer);
dataView.setInt8(0, 104);
dataView.setInt16(1, 101);

dataView.getInt8(0);

Base64

Base64 是一种编码方式,将二进制数据转换为字符串。

  • 值为字符串。
  • 二进制的的一种表现方式。
  • 一种编码方式,字符集包含A-Z、a-z、0-9、+、/

创造实例

读取FileBlob

javascript 复制代码
let blob = new Blob(["Hello, world!"], { type: "text/plain" });
let render = new FileReader();
render.onload = function (e) {
  console.log(e.target.result);
};
render.readAsDataURL(blob);

Canvas 创建 Base64

html 复制代码
<canvas id="canvasId" width="200" height="200"></canvas>
<script>
  const canvasDom = document.getElementById("canvasId");
  const context = canvasDom.getContext("2d");
  context.fillStyle = "red";
  context.fillRect(0, 0, 200, 200);

  console.log(canvasDom.toDataURL());
</script>

ObjectURL

ObjectURL 属于 URL 类型,是一种特殊的 URL,可以用来表示一个内存中的对象。

  • 属于 URL 字符串。
  • 用来表示内存中的二进制对象 (BlobFile)。
  • 可以用来表示一个内存中的对象。
  • 生存周期与其创建时所在窗口的生存周期绑定在一起。

创造实例

URL.createObjectURL

javascript 复制代码
const blob = new Blob(["hello"], {
  type: "text/plain",
});
URL.createObjectURL(blob);

小细节

  • ObjectURL 中创建的URL 不会自动释放内存空间,需要手动释放。

    javascript 复制代码
    const blob = new Blob(["hello"], {
      type: "text/plain",
    });
    const objectURL = URL.createObjectURL(blob);
    console.log(objectURL);
    
    // 手动释放
    URL.revokeObjectURL(objectURL);

Text

Text 是一种字符串类型,用于表示文本数据。

创造实例

字面量

javascript 复制代码
const text = "hello";

ArrayBufferText

javascript 复制代码
const arrayBuffer = new Int8Array([104, 101, 108, 108, 111]);
const text = new TextDecoder().decode(arrayBuffer);
console.log(text);

后记

相关推荐
IT技术分享社区1 分钟前
前端:浏览器Content Security Policy 安全策略介绍和用法
前端·前端开发
林强1814 小时前
前端文件预览docx、pptx和xlsx
前端
像是套了虚弱散6 小时前
DevEco Studio与Web联合开发:打造鸿蒙混合应用的全景指南
开发语言·前端·华为·harmonyos·鸿蒙
衬衫chenshan7 小时前
【CTF】强网杯2025 Web题目writeup
前端
飞翔的佩奇7 小时前
【完整源码+数据集+部署教程】【天线&水】舰船战舰检测与分类图像分割系统源码&数据集全套:改进yolo11-repvit
前端·python·yolo·计算机视觉·数据集·yolo11·舰船战舰检测与分类图像分割系统
哆啦A梦15888 小时前
点击Top切换数据
前端·javascript·vue.js
程序猿追8 小时前
Vue组件化开发
前端·html
艾德金的溪9 小时前
redis-7.4.6部署安装
前端·数据库·redis·缓存
小光学长9 小时前
基于Vue的2025年哈尔滨亚冬会志愿者管理系统5zqg6m36(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
@PHARAOH9 小时前
WHAT - 受控组件和非受控组件
前端·javascript·react.js