您的位置:首页 > Web前端 > Node.js

node.js 的 Buffer 方法的简单介绍

2018-01-07 21:16 671 查看

Buffer

Buffer 函数是调用系统内存的方法,node环境输入 Buffer 得出



poolSixe : 内存载体的容量
isBuffer : 静态方法 ,判断对象是否是 Buffer 类型对象
compare : 判断两个 Buffer 对象的相对位置,一般来做按字符串的排序什么的
isEncoding : 判断node.js 是否支持某种编码
concat : 主要是将几个 Buffer 对象连接组成一个新的 Buffer对象,可以手动分配空间大小,如果空间不够,数据会被截断
byteLength : 用来获得指定编码下字符串所占的字符数

toString

toString 把 buffer 数据转成 xx 编码,默认不传是 uft-8 格式

示例

var buf = new Buffer('Hello');

var str = buf.toString('base64'); // 把 buffer 数据转成 base64 编码

str //就输出了 base64 格式的数据   'SGVsbG8='

//现在把 base64 转换还原回来
var buf2 = new Buffer('SGVsbG8=','base64');  //创建一个 buffer ,指定编码为 base64

var str = buf.toString('utf-8'); //不写也可以默认为 uft-8

str 就输出了 'Hello'

//其它转换也是同理


write

Buffer.write(string , offset=0 , length, encoding="utf-8") 

write 是把数据写入 Buffer 中

第一个参数是要写入的字符串 ,

第二个参数是 字符串转换为字节数据后写入的位置

第三个参数是 字符串转换为字节数据后写入的长度

第4个参数为指定字符串写的的编码格式,默认为 utf-8

示例:buf.write

//new  一个
var buf = new Buffer('Hello 贤哥');
buf.length  //打印出来   12  (注:12是字节数,一个汉字不是一个字节)

//向 buf 写入
buf.write('Hi 贤哥');  //打印出来 9

//打印出 buf 里存的东西
buf.toString()   // 'Hi 贤哥哥'    ???怎么会多一个哥

//再次打印 buf 长度
buf.length  //打印出来   12  因为这个长度在初始化的时候就固定了

//打印出 'Hi 贤哥哥' 是因为写入的 'Hi 贤哥'的9个字节 把 'Hello 贤哥'的12个字节的前面9个给覆盖了,所后面的 12-9=3 个字节依然在,并没有变化

//向 buf 再次写入
buf.write(' ImoocImooc',2,11);  // 写入 ' ImoocImooc' ,从第2个字节开始 ,写入字符串的长度为 11个字节
10   //打印出   10  的意思是写入了10个字节

buf.toString();
//打印出 'Hi ImoocImoo'   因为总字节只有12个  ,从第二个开始写入 就是 'Hi' 的后面,代码中写入的11个字节最后只写了10个进去,因为总空间只有12个,从第二个开始,空格也算一个,后面只有10个字节的空间了,所以最后那个 'c' 因为没有空间所以没有写进


copy

buffer.copy(target, tStart, sStart, sEnd=buffer.length)

copy 复制

第一个参数是用来指定复制的目标 buffer

第二个参数是目标 buffer 从第几个字节开始写,默认是 0

第三个参数是用来指定从原 buffer 里获取数据时的开始位置,默认是 0

第4个参数是指定从复制源对象里面获取数据的结束位置,默认是复制源的长度(就是复制到最后一个)

示例

var buf = new Buffer('Hello Imooc');
buf.length  //创建一个 buffer 共11个字节

var buf2 = new Buffer(5); //创建另一个 buffer 共5个字节

buf.copy(buf2);  //把 buf 复制到 buf2
buf2.toString();  //打印出来  'Hello',buf2的空间只是5个字节,所以只写入了前5个字节

buf.copy(buf2, 0, 6 ,11);  //1、把 buf 复制到 buf2 ,2、从buf2第0个字开始写入 ,3、从buf的第6个字节开始复制 ,4、复制到第11个字节
buf2.toString();  //打印出来  'Imooc'


下面是一个实用的示例

该示例是 读取图片文件 ,再从新生成一个  和 用 buffer 把图片把读出来的数据转成 base64 编码,再重新生成一个图片

var fs = require('fs');  //引入文件模块

//读取当前文件里的 img.jpg 的文件数据,同时创建到 origin_buffer 对象中
fs.readFile('img.jpg', function(err, origin_buffer) {

//查看 origin_buffer 是不是一个 Buffer ,true
console.log(Buffer.isBuffer(origin_buffer))

//在当前文件里写入一个新文件, 名叫new.jpg , 内容是 origin_buffer
fs.writeFile('new_img.jpg', origin_buffer , function(err){
if(err){console.log(err)}
})

//复制一个图片
//1、把 origin_buffer 转成 base64 编码,origin_buffer 已经是一个 Buffer 了,所以可以直接用
var base64Image = origin_buffer.toString('base64');

console.log(base64Image);

//2、用 base64Image 创建一个 buffer,指定编码为 base64
var decodedImage = new Buffer(base64Image,'base64');

//可以比较一个 上面读取的 Buffer 和 转成 base64 后新创建的 Buffer 是不是一样的,结果是 true
console.log(Buffer.compare(origin_buffer, decodedImage));

//3、再用 new 的 buffer 写一个新文件
fs.writeFile('new_buffer_img.jpg', decodedImage , function(err){
if(err){console.log(err)}
})

//无论是直接读取生成的图片还是转成 base64 再生成的图片都是一模一样的
})
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: