【node.js】Buffer

Buffer 简介

  • 结构上,Buffer 和 Array 很像
    但 Array 不能存储二进制文件(图片、视频、音乐),而 Buffer 可以
  • 在 Buffer 中,存储的都是 2 进制数据,但都用 16 进制数字显示
  • Buffer 中的内存不是通过 JS 分配的,是在底层通过 C++ 申请的,我们可以直接通过 Buffer 来创建内存中的空间
  • Buffer 的 1 个元素占 1 byte(8bit → 0~255 → 00~ff)

创建 Buffer 实例

Buffer 不需要引入模块,可以直接使用,但仍然建议通过 require 语句显式地引用一下

Buffer.from(string[, encoding])

  • string:要编码的字符串
  • encodingstring 的编码格式
    当在 Buffer 和字符串之间进行转换时,可以指定字符编码,默认 'utf8'
const { Buffer } = require('buffer');
let buf1 = Buffer.from('superman');
console.log(buf1); // 
console.log(buf1.toString()); // superman

如果 string 不是字符串 / 是其他不适用于 Buffer.from() 的类型,则会抛出 TypeError

Buffer.alloc(size[, fill[, encoding]])

  • size:新的 Buffer 所需的长度
  • fill:用于填充 Buffer 的值, 默认 0
  • encoding:如果 fill 是字符串,则可设置编码格式,默认 'utf8'
const { Buffer } = require('buffer');
let buf = Buffer.alloc(5);
console.log(buf); // 

如果 size 大于 buffer.constants.MAX_LENGTH 或小于 0, 则会抛出 ERR_INVALID_ARG_VALUE
如果 size 不是数值, 则会抛出 TypeError

  • 如果指定了 fill, 则分配的 Buffer 将通过调用 buf.fill(fill) 进行初始化
const { Buffer } = require('buffer');
let buf = Buffer.alloc(5, 'abc');
console.log(buf); // 
  • 如果同时指定了 fillencoding, 则分配的 Buffer 将通过调用 buf.fill(fill, encoding) 进行初始化
const { Buffer } = require('buffer');
let buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
console.log(buf); // 

Buffer.allocUnsafe(size)

  • size 新的 Buffer 所需的长度
  • 分配 size个字节的新 Buffer。如果 size大于 buffer.constants.MAX_LENGTH或小于 0, 则抛出 ERR_INVALID_ARG_VALUE
  • 以这种方式创建的 Buffer 实例的底层内存不会被初始化。新创建的 Buffer 的内容是未知的,可能包含敏感的数据
  • Buffer.alloc()Buffer.allocUnsafe() 慢,但可确保新创建的 Buffer 实例的内容不会包含来自先前分配的敏感数据,包括可能尚未分配给 Buffer 的数据
const { Buffer } = require('buffer');
let buf = Buffer.allocUnsafe(10);
console.log(buf); // 

Buffer 特性

length 属性

Buffer 实例的 length 属性,表示的是占用内存的大小

let str = "超人";
let buf = Buffer.from(str);
console.log(str.length); // 2
console.log(buf.length); // 6

上例中 1 个中文字符占 3 byte;有的编码格式中,中文字符占 2 byte

Buffer 的大小

Buffer 的大小,一旦确定,则不能修改;Buffer 实际上是对底层内存的直接操作

let buf = Buffer.alloc(5); // 创建长度为 5 的 Buffer
buf[5] = 12; // 试图 "拉长" Buffer
console.log(buf); //  长度没有变

Buffer 没有被改动;如果是数组的话,会把数组拉长

溢出问题

如果元素的数值大于 255,则会发生溢出,数值转成二进制后,会大于 8 bit,此时计算机会将高位截断

let buf = Buffer.alloc(5);
buf[1] = 257;
console.log(buf); // 

257 → 1 0000 0001 → 0000 0001 → 1

  • Buffer 显示的是 16 进制,但只要是控制台打印出来的数字,都是 10 进制数字
  • 如果想显示 16 进制的数据,可以调用 .toString(num) 方法,num 为输出的进制
let buf = Buffer.alloc(5);
buf[1] = 0xaa;
console.log(buf[1], buf[1].toString(16)); // 170 aa

你可能感兴趣的:(node.js,node.js,前端,javascript)