Buffer、ArrayBuffer、Blob 和 Base64 怎么区分?中文分块怎么解码?

先理解原理和示例,再练习完整口述与追问。

Buffer 是字节视图;ArrayBuffer 是内存容器;Blob 是不可变原始数据对象;Base64 是编码且增大体积;增量解码保留尾字节。

Buffer 是 Node 处理二进制的主要接口,也是 Uint8Array 的一种。ArrayBuffer 表示原始内存,通常通过 TypedArray/DataView 读写;Blob 在支持环境中表达带类型的不可变数据片段,可用于文件和请求。Base64 把二进制编码为文本,通常增加约三分之一体积,不是压缩或加密。

UTF-8 一个字符可能跨多字节,网络 chunk 又可在任何字节切开。逐块独立 toString 可能得到替换字符,应使用增量解码器保留未完整尾部。

js
const { StringDecoder } = require('string_decoder')
const input = Buffer.from('你好', 'utf8')
const decoder = new StringDecoder('utf8')
const text = decoder.write(input.subarray(0, 2))
  + decoder.write(input.subarray(2)) + decoder.end()
console.log(text) // 你好

Buffer 的切片可能共享内存,修改一处影响另一处;allocUnsafe 需确保写满后才能暴露,不能泄露未初始化内容。

我按字节容器、视图、文件对象与文本编码区分这些类型。二进制传输尽量避免不必要 Base64,文本流使用增量解码,处理切片共享、长度和初始化边界。