Buffer 二进制数据
Buffer 是 Node 的二进制数据容器:一段固定长度的字节。读文件不传 utf8 时返回的是它,网络传输的内容也是它——Node 处理二进制流(图片、压缩包、协议字节)全靠它。
它与字符串互转:Buffer.from('你好', 'utf8') 编码成字节,buf.toString('utf8') 解回文字。一个汉字在 utf8 下占 3 字节,所以 buf.length 是字节数而不是字符数——这是新手最常踩的坑。
- Buffer.alloc(n) 分配 n 字节(内容清零,安全);allocUnsafe 更快但含旧数据
- buf.length 是字节数,utf8 中文每字 3 字节,与字符串 length 不同
- Buffer.from(str, utf8) ↔ buf.toString(utf8) 是编解码两兄弟
JS
const fs = require('fs'); // 字符串 → Buffer → 字符串 const buf = Buffer.from('你好 Node', 'utf8'); console.log('字节长度:', buf.length); // 13(两个汉字 6 + 空格与英文 7) console.log('字符长度:', '你好 Node'.length); // 8 console.log(buf.toString('utf8')); // 你好 Node console.log(buf.toString('hex')); // 十六进制字节 console.log(buf[0].toString(16)); // e4(第一个字节) // Base64 网络传输常见 const b64 = Buffer.from('user:pass').toString('base64'); console.log('Basic 认证头:', 'Basic ' + b64); console.log('解码:', Buffer.from(b64, 'base64').toString()); // 读图片就是读 Buffer(二进制不能当 utf8 字符串) const img = fs.readFileSync('./logo.png'); // 拿到 Buffer const isPng = img.length > 4 && img[0] === 0x89 && img[1] === 0x50; // PNG 魔数 console.log('是 PNG 吗', !!isPng);
本节要点Buffer 是字节容器:from/toString 搞编解码,注意 buf.length 数字节不数字符。




