在 JavaScript 中玩转二进制:ArrayBuffer 与 TextEncoder/Decoder 入门指南

45 阅读4分钟

大家好!今天咱们来聊点“底层”的——但别担心,不是让你去写汇编,而是用 JavaScript 轻松操作二进制数据。你可能觉得“二进制?那不是 C/C++ 的地盘吗?”其实不然!从 HTML5 开始,JavaScript 也拥有了处理二进制的能力,尤其在处理图片、音频、网络通信等场景时特别实用。

今天我们就通过一个简单的例子,看看如何用 ArrayBufferUint8ArrayTextEncoderTextDecoder 来编码和解码字符串,顺便理解它们之间的关系。


为什么需要处理二进制?

在计算机世界里,一切最终都是二进制。文字、图片、视频……最终都会变成一串 0 和 1 存储或传输。但在日常开发中,我们通常直接操作字符串、对象这些高级结构。然而,一旦涉及网络请求、文件读取、加密、音视频处理等场景,就绕不开原始的二进制数据了。

HTML5 引入了一套强大的 API,让我们能在浏览器中高效地操作这些“字节”。


核心三剑客:ArrayBuffer、TypedArray、TextEncoder/TextDecoder

1. ArrayBuffer:一块原始内存

你可以把它想象成一个固定大小的“盒子” ,里面装着原始的二进制数据。但它本身不能直接读写——就像一个上了锁的箱子,你需要一把“钥匙”才能操作里面的内容。

const buffer = new ArrayBuffer(12); // 创建一个 12 字节的缓冲区

2. Uint8Array:打开盒子的“视图”

这就是那把“钥匙”!Uint8Array 是一种 TypedArray(类型化数组) ,它提供了一个视图(view) ,让我们能以“8位无符号整数”(即 0~255 的字节)的方式读写 ArrayBuffer

const view = new Uint8Array(buffer);

关键点来了:视图和缓冲区共享同一块内存。也就是说,你修改 view[0],实际上就是在修改 buffer 里的第一个字节!

3. TextEncoder & TextDecoder:字符串 ↔ 字节的桥梁

  • TextEncoder:把 JS 字符串(如 '你好')编码成 UTF-8 格式的字节序列(Uint8Array)。
  • TextDecoder:把 UTF-8 字节序列还原成可读的字符串。

它们是处理文本与二进制之间转换的“翻译官”。


动手实践:把“你好 HTML5”存进 Buffer

来看一段完整代码(就是你写的那个 😄):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>HTML 5 Buffer</title>
</head>
<body>
  <h1>Buffer</h1>
  <div id="output"></div>

  <script>
    // 1. 编码字符串为 UTF-8 字节
    const encoder = new TextEncoder();
    const myBuffer = encoder.encode('你好 HTML5');
    console.log(myBuffer); // Uint8Array(12) [228, 189, 160, 229, 165, 189, 32, 72, 84, 77, 76, 53]

    // 2. 创建一个 12 字节的 ArrayBuffer
    const buffer = new ArrayBuffer(12);
    const view = new Uint8Array(buffer);

    // 3. 把编码后的字节逐个拷贝到 buffer 中
    for (let i = 0; i < myBuffer.length; i++) {
      view[i] = myBuffer[i];
    }
    //此时 buffer中就存储着'你好 HTML5的UTF-8字节了'
    //为什么这个是逐个拷贝到view[i] 却说是拷贝给buffer? 因为视图view和缓冲区buffer 共享同一块内存 修改view[i]会直接修改buffer的内容

    // 4. 用 TextDecoder 把 buffer 解码回字符串
    const decoder = new TextDecoder();
    const originalText = decoder.decode(buffer);
    console.log(originalText); // "你好 HTML5"

    // 5. 显示结果
    document.getElementById('output').innerHTML = `
      完整数据: [${view}] <br>
      第一个字节: ${view[0]} <br>
      缓冲区的长度: ${buffer.byteLength} <br>
      原来的文本: ${originalText}
    `;
  </script>
</body>
</html>

这段代码做了什么?

  1. TextEncoder'你好 HTML5' 转成 12 个字节的 Uint8Array
  2. 创建一个同样大小(12 字节)的 ArrayBuffer
  3. 通过 Uint8Array 视图,把字节一个个“搬”进 buffer
  4. 再用 TextDecoderbuffer 里读出来,完美还原原始文本!

你会发现:

  • 中文字符(如“你”)在 UTF-8 中占 3 个字节,所以 '你好' 占 6 字节;
  • 空格和英文字符各占 1 字节;
  • 总共 6 + 1 + 5 = 12 字节,刚好填满我们的 ArrayBuffer

小结:轻松掌握二进制操作

  • ArrayBuffer 是底层存储,不能直接操作。
  • TypedArray(如 Uint8Array)是操作 ArrayBuffer 的窗口。
  • TextEncoder / TextDecoder 让字符串和字节互转变得超简单。
  • 所有操作都在内存中完成,高效且安全。

虽然今天我们只处理了文本,但这套机制同样适用于图片(Blob)、音频(Web Audio API)、WebSocket 二进制帧等场景。掌握它,你就离“全栈二进制玩家”又近了一步!


下次当你看到 ArrayBuffer 不再一脸懵,而是自信地说:“哦,不就是个装字节的盒子嘛!”——恭喜你,已经入门啦!🎉

希望这篇小文能帮你轻松理解 JavaScript 中的二进制操作。如果你觉得有用,欢迎点赞、收藏,也欢迎在评论区聊聊你用这些 API 做过哪些有趣的项目!