3. NodeJs 的 buffffer 缓冲器

buffffer 用于处理二进制数据,在 v8 堆外分配物理内存, buffffer 实例类似 0-255 之间的整数数组,显
示的数据为十六进制,大小是固定的,无法修改。
 
官网文档地址: http://nodejs.cn/api/buffffer.html
 

创建buffffer

1.  Buffffer.alloc(size[, fifill[, encoding]])
          size : Buffer 的所需长度。
          fill: 用 于预填充新 Buffer 的值。 默认值 : 0
          encoding:  如果 fill 是一个字符串,则这是它的字符编码。 默认值 : 'utf8'
console.log(Buffer.alloc(10));//创建一个长度为10的Buffer,默认填充0
console.log(Buffer.alloc(10,2));//创建一个长度为10的Buffer,填充2
console.log(Buffer.alloc(10,100));//创建一个长度为10的Buffer,填充1000,16进制显示
console.log(Buffer.alloc(10,-1));//创建一个长度为10的Buffer,-1强制转换成255

结果:
<Buffer 00 00 00 00 00 00 00 00 00 00>
<Buffer 02 02 02 02 02 02 02 02 02 02>
<Buffer 64 64 64 64 64 64 64 64 64 64>
<Buffer ff ff ff ff ff ff ff ff ff ff>

const buf = Buffer.alloc(10);
buf[10] = 1;
console.log(buf);

结果:证明buffer长度不可变
<Buffer 00 00 00 00 00 00 00 00 00 00>

console.log(Buffer.alloc(10,'静静'));
console.log(Buffer.alloc(10,'静静','base64'));

结果:

<Buffer 65 72 69 63 65 72 69 63 65 72>
<Buffer 7a b8 9c 7a b8 9c 7a b8 9c 7a>
2.  Buffffer.allocUnsafe(size)
        size Buffer 的所需长度。分配内存的片段没有清空,会有之前遗留的数据,速度快
console.log(Buffer.allocUnsafe(10));//创建一个长度为10未初始化的buffer

结果:
<Buffer d8 27 ff 02 00 00 00 00 01 00>
3.  Buffffer.from(array)
          array 整数数组
console.log(Buffer.from([1,2,3]));//创建buffer,填充[1,2,3]

结果
<Buffer 01 02 03>

4.  Buffffer.from(string[, encoding])

          string:  要编码的字符串。
          encoding :string 的字符编码。 默认值 : 'utf8'
 
console.log(Buffer.from('静静')); //创建buffer,填充字符串
console.log(Buffer.from('静静','base64')); //创建buffer,填充bese64编码的字符串

结果:
<Buffer e9 9d 99 e9 9d 99>
<Buffer 61>

Buffffer类上常用的属性、方法

 
Buffffer.byteLength: 返回字符串的字节长度
console.log(Buffer.byteLength('jingjing'));//返回字符串的字节长度,8
console.log(Buffer.byteLength('静静'));//6,一个文字代表3个字节

结果:
8
6

Buffffer.isBuffffer(obj): 判断是否是buffffer

console.log(Buffer.isBuffer({}));
console.log(Buffer.isBuffer(Buffer.from('jingjing')));

结果:
false
true

Buffffer.concat(list[, totalLength])合并buffffer

const buf = Buffer.from('hello');
const buf2 = Buffer.from('jingjing');
console.log(buf);
console.log(buf2);
console.log(Buffer.concat([buf,buf2]));
console.log(Buffer.concat([buf,buf2],buf.length+buf2.length));
console.log(Buffer.concat([buf,buf2],10));  ///指定长度过短,会只显示这个长度,如果长度过长,则多余的会以00填充

结果:
<Buffer 68 65 6c 6c 6f>
<Buffer 6a 69 6e 67 6a 69 6e 67>
<Buffer 68 65 6c 6c 6f 6a 69 6e 67 6a 69 6e 67>
<Buffer 68 65 6c 6c 6f 6a 69 6e 67 6a 69 6e 67>
<Buffer 68 65 6c 6c 6f 6a 69 6e 67 6a>
buf.write(string[, offffset[, length]][, encoding]) 将字符写入 buffffer, 返回已经写入的字节
    string : 要写入 buf 的字符串。
    offset : 从指定索引下写入。 默认值 : 0
    length:  要写入的字节数。 默认值 : buf.length - offset
    encoding : 字符串的字符编码。 默认值 : 'utf8'
const buf = Buffer.allocUnsafe(20); //未初始化的状态
console.log(buf);

console.log(buf.write('buffer'));
console.log(buf);

console.log(buf.write('buffer',5,3));
console.log(buf);

结果:

<Buffer 48 13 00 03 00 00 00 00 a0 13 00 03 00 00 00 00 00 00 00 00>
6   //返回写入的字节数
<Buffer 62 75 66 66 65 72 00 00 a0 13 00 03 00 00 00 00 00 00 00 00>
3
<Buffer 62 75 66 66 65 62 75 66 a0 13 00 03 00 00 00 00 00 00 00 00>
buf.fill(value[, offffset[, end]][, encoding]) 填充 buffffer
    value :用 来填充 buf 的值。
    offset : 开始填充 buf 的索引。 默认值 : 0
    end : 结束填充 buf 的索引(不包含)。 默认值 : buf.length
    encoding:  如果 value 是字符串,则指定 value 的字符编码。 默认值 : 'utf8'
const buf = Buffer.allocUnsafe(20);
console.log(buf);
console.log(buf.fill('jingjing'));
console.log(buf.fill('jingjing',5,10)); //前5个一样

结果:
<Buffer d4 38 66 1f 00 00 00 00 18 24 2d 03 00 00 00 00 01 00 00 00>
<Buffer 6a 69 6e 67 6a 69 6e 67 6a 69 6e 67 6a 69 6e 67 6a 69 6e 67>
<Buffer 6a 69 6e 67 6a 6a 69 6e 67 6a 6e 67 6a 69 6e 67 6a 69 6e 67>

buf.length buffffer的长度

const buf = Buffer.allocUnsafe(20);
console.log(buf.length);

结果:
20

buf.toString([encoding[, start[, end]]]) buffffer解码成字符串形式

    encoding : 使用的字符编码。 默认值 : 'utf8'
    start : 开始解码的字节索引。 默认值 : 0
    end : 结束解码的字节索引(不包含)。 默认值 : buf.length

buf.toJSON 返回 buffffer JSON 格式

const buf = Buffer.from('test');
console.log(buf.toString());
console.log(buf.toString('utf8',1,3));
console.log(buf.toJSON());

结果:
test
es
{ type: 'Buffer', data: [ 116, 101, 115, 116 ] }
buf.equals otherBuffffer 对比其它 buffffer 是否具有完全相同的字节
    otherBuffer : 要对比的 buffffer
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');

console.log(buf1);
console.log(buf2);

console.log(buf1.equals(buf2));
// 打印: true
console.log(buf1.equals(buf3));

结果:
<Buffer 41 42 43>
<Buffer 41 42 43>
true
false
buf.indexOf/lastIndexOf 查找指定的值对应的索引
const buf1 = Buffer.from('ABCB');
console.log(buf1.indexOf('B'));
console.log(buf1.lastIndexOf('B'));

结果:
1
3

buf.slice([start[, end]]) 切割buffffer

    start:  Buffer 开始的位置。 默认值 : 0
    end : Buffer 结束的位置(不包含)。 默认值 : buf.length
const buf = Buffer.from('abcdefghi');
console.log(buf.slice(2,7).toString());

结果:
cdefg
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]]) 拷⻉ buffffer 
    target: 要拷贝进的 Buffer Uint8Array
    targetStart :目标 buffer 中开始写入之前要跳过的字节数。 默认值 : 0
    sourceStart 来源 buffer 中开始拷贝的索引。默认值 : 0
    sourceEnd 来源 buffer 中结束拷贝的索引(不包含)。默认值 : buf.length
 

const buf = Buffer.from('abcdefghi');
const buf2 = Buffer.from('test');

console.log(buf.copy(buf2));
console.log(buf2.toString());

console.log(buf2.copy(buf,2)); //把buf2拷贝进buf,从第二个开始替换
console.log(buf.toString());

console.log(buf2.copy(buf,2,1,3));
console.log(buf.toString());

结果:
4
abcd
4
ababcdghi
2
abbccdghi

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值