美文网首页
Buffer缓冲器

Buffer缓冲器

作者: Leonard被注册了 | 来源:发表于2019-12-14 11:49 被阅读0次

1.什么是Buffer

        缓冲区Buffer是暂时存放输入输出数据的一段内存,JS语言没有二进制数据类型,而当处理TCP和文件流时我们必须要处理二进制数据,因此Node为我们提供了一个Buffer对象对二进制数据进行操作。
        Buffer是一个标识固定内存分配的全局对象,也就是说要放到缓存区中的字节数需要提前确定好,它就好比由一个8位字节元素组成的数组,可以有效地在JS中表示二进制数据。

2.定义Buffer的三种方式

  • 通过长度定义
    //表示分配一个长度为6个字节的Buffer
    //且会把所有的字节设置为0
    //可以提供默认值
    let buf1 = Buffer.alloc(6);
    let buf2 = Buffer.alloc(6,2);
    console.log(buf1);    // <Buffer 00 00 00 00 00   00>
    console.log(buf2);    // <Buffer 02 02 02 02 02 02>
    
    //分配一块没有初始化的内存
    let buf3 = Buffer.allocUnsafe(6);
    console.log(buf3);    // 出现6字节的随机数据
    
  • 通过字符串定义
    let buf4 = Buffer.from('哈哈');
    console.log(buf4);    // <Buffer e5 93 88 e5 93 88>
    
  • 通过数组定义
    let buf5 = Buffer.from([1,2,3]);
    console.log(buf5);    // <Buffer 01 02 03>
    

3.常用方法

1.buf.fill(value,offset,end,encoding)

@params
value:需要填充的内容
offset:开始写入之前要跳过的字节数
end:填充结束索引
encoding:表示编码方式
@return
填充后的Buffer数据

let buf6 = Buffer.alloc(6);
buf6.fill(3,1,3);    
console.log(buf6);    // [0,3,3,0]

2.buf.write(value,offset,length,encoding)

@params
value:需要写入的字符串
offset:开始写入之前要跳过的字节数
length:写入的字节长度
encoding:表示编码方式
@return
写入后的Buffer数据

let buf7 = Buffer.alloc(6);
buf7.write("哈哈",0,3,'utf8');
console.log(buf7);      // <Buffer e5 93 88 00 00 00>
console.log(buf7.toString());   // 哈

3.buf.writeInt8(value,offset)

@params
value:需要写入的数值
offset:开始写入之前要跳过的字节数
@return
写入后的Buffer数据

let buf8 = Buffer.alloc(6);
// 向指定的索引写入一个8位的整数,也就是说占用一个字节的整数
buf8.writeInt8(0,0);
buf8.writeInt8(16,1);
buf8.writeInt8(32,2);
console.log(buf8);    // <Buffer 00 10 20 00 00 00>

let buf9 = Buffer.alloc(6);

// Big Endian 高位在前
buf9.writeInt16BE(2**8,0);
console.log(buf9);  // <Buffer 01 00 00 00 00 00>
console.log(buf9.readInt16BE(0));   // 256

// Little Endian 低位在前
buf9.writeInt16LE(2**8,2);
console.log(buf9);  // <Buffer 01 00 00 01 00 00>
console.log(buf9.readInt16LE(2));   // 256

4.buf.slice(start,end)

@params
start:新Buffer开始的位置
end:新Buffer结束的位置
@return
新的Buffer数据,它引用与原始的 Buffer 相同的内存

let buf10 = Buffer.alloc(6,1);
let buf11 = buf10.slice(2,6);
console.log(buf11);  // <Buffer 01 01 01 01>
buf11.fill(4);
console.log(buf10);  // <Buffer 01 01 04 04 04 04>

// 解决乱码问题
let buf12 = Buffer.from('哈哈哈哈');
let buf13 = buf12.slice(0,5);
let buf14 = buf12.slice(5);
console.log(buf13.toString());   // 哈�
console.log(buf14.toString());   // �哈哈
let {StringDecoder} = require('string_decoder');
let sd = new StringDecoder();
// write的时候会判断是不是一个字符
// 如果是的话就输出,不是的话则缓存在对象内部,等下次write的时候会把前面缓存的字符加到第二次write的buffer上再进行判断
console.log(sd.write(buf13));    // 哈
console.log(sd.write(buf14));    // 哈哈哈

5.Buffer.isBuffer(obj)

@params
obj:需要判断的对象
@return
如果obj是一个Buffer,则返回 true,否则返回 false。

let obj1 = Buffer.alloc(6);
let obj2 = [1,2,3];
console.log(Buffer.isBuffer(obj1));     // true
console.log(Buffer.isBuffer(obj2));     // false

6.Buffer.byteLength(string, encoding)

@params
string:要计算长度的值
encoding:编码方式
@return
string中包含的字节数

console.log(Buffer.byteLength('哈哈','utf-8'));  // 6

相关文章

网友评论

      本文标题:Buffer缓冲器

      本文链接:https://www.haomeiwen.com/subject/fqhfnctx.html