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