Node中buffer模块使用

本文详细介绍了Node.js的Buffer模块,包括创建Buffer对象、Buffer与字符串之间的转换、Buffer与JSON的互转,以及Buffer的拷贝和填充操作。特别强调了在实际操作中可能遇到的复杂性,建议通过实践来熟悉这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.注意点

下面的代码是一个大标题一个文件,所以变量名存在重复,单纯的看不影响,如果想拷贝出去 请分开拷贝。

2.创建buffer对象

// 创建Buffer对象的3种方法
//1. Buffer.alloc(length,填充物,编码)
const buf1=Buffer.alloc(10,1);
console.log(buf1); // <Buffer 01 01 01 01 01 01 01 01 01 01>

// 2.Buffer.allocUnsafe(length)
// 效率高,但不安全 可能包含旧数据  需使用fill()或者write()重写
const buf2=Buffer.allocUnsafe(10);
buf2.fill(1);
console.log(buf2); // <Buffer 01 01 01 01 01 01 01 01 01 01>

// 3.Buffer.from()  
// 接收四种类型的参数 array、string、arrayBuffer、buffer
// 第二个参数指定字符集:ascii utf8 utf16le base64 latin1(binary) hex 
let arrayBuf=Buffer.from([1,2,3]);
console.log(arrayBuf);  // <Buffer 01 02 03>

let game='王者荣耀';
let stringBuf=Buffer.from(game,'utf8');
console.log(stringBuf);  // <Buffer e7 8e 8b e8 80 85 e8 8d a3 e8 80 80>

let copyBuf1=Buffer.from(arrayBuf);
console.log(copyBuf1);   // <Buffer 01 02 03>

let copyBuf2=Buffer.from(buf1);
console.log(copyBuf2);   // <Buffer 01 01 01 01 01 01 01 01 01 01>

3. buffer和字符串的转换

// 1.toString()方法可以将buffer转换成字符串
let game='王者荣耀';
let buffer=Buffer.from(game);
console.log(buffer);   // <Buffer e7 8e 8b e8 80 85 e8 8d a3 e8 80 80>
console.log(buffer.toString()); //王者荣耀

// 2.StringDecoder 将buffer转成字符串
// 先导入这个类
let stringDecoder=require('string_decoder').StringDecoder;
// 实例化
let decoer=new stringDecoder('utf8');
// 转成字符串
console.log(decoer.write(buffer));

//3. write('替换物',start-开始替换的位置,length-替换几个字节,encoding-编码集)
// 什么参数都不写 默认从0位置开始写入 写入的长度和替换为的字节数保持一致
//注意点:替换物的字节长度需要和length保持一致
// 将字符串写入buffer
buffer.write('射手',0,6,'utf8');
console.log(buffer.toString());

4. buffer和字符串的转换

理解字节序-阮一峰 关于计算 可以看一下这个文章

let buffer=Buffer.from([1,2,3]);
console.log(buffer);

// 1.read+(?U)(Int/Float/Double)+位数(8/16/32)+?(BE/LE)
//带U无符号  不带U有符号
// BE:Big-endian 大端序
// LE:Little-endian 小端序
// 第一个参数为起始位置  第二个参数为超出时是否报错 默认是false,超出报错

console.log(buffer.readInt8(1));

//2.write+(Int/Float/Double)+位数(8/16/32)+(16或者32要加BE/LE)
//第一个参数为写入的数据 第二个是起始位置 第三个为超出报错的标志
buffer.writeUInt8(127,0);
console.log(buffer);

5. buffer和JSON的转换

let buffer=Buffer.from('王者荣耀');
//1.使用JSON.stringify将buffer转成字符串  类型是string
let game=JSON.stringify(buffer)
console.log(game); //{"type":"Buffer","data":[231,142,139,232,128,133,232,141,163,232,128,128]}

//2.再使用JSON.parse将字符串还原成对象
gameArray=JSON.parse(game);
console.log(gameArray); // 这是一个对象 
/*
{
  type: 'Buffer',
  data: [
    231, 142, 139, 232,
    128, 133, 232, 141,
    163, 232, 128, 128
  ]
} */
console.log(Buffer.from(gameArray).toString()); // 王者荣耀

6. 拷贝与填充

这个稍微有点绕 尝试几次就可以了
// 1.source.copy(target,targetStart,sourceStart,sourceEnd)
// source是被拷贝者 , target是拷贝者
let buffer1=Buffer.from('王者荣耀');
let buffer2=Buffer.alloc(12);
let buffer3=Buffer.from('全军出击');
// 这里是将buffer1中位置0~6的数据拷贝到buffer2的0~6的位置上
buffer1.copy(buffer2,0,0,6);
console.log(buffer1.toString());  // 王者荣耀
console.log(buffer2.toString());  // 王者

// 这里是将buffer1中位置6~结束的数据拷贝到buffer3的0开始的位置上 长度为buffer1中6~结束的长度
buffer1.copy(buffer3,0,6);
console.log(buffer3.toString());  // 荣耀出击

// 2.使用特定的数字填充buffer
let buffer4=Buffer.alloc(10);
buffer4.fill(10);
console.log(buffer4);  //<Buffer 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a>

// 3.使用特定的字符串填充buffer
buffer4.write('a');
console.log(buffer4);

7. Buffer类方法

//1. Buffer.isBuffer方法  判断是否是buffer类型
let buffer=Buffer.from('王者荣耀');
console.log(Buffer.isBuffer(buffer));   // true
console.log(Buffer.isBuffer('OK'));     // false


//2.Buffer.byteLength  返回buffer字节数
console.log(Buffer.byteLength(buffer));  // 12

//3.Buffer.concat(Buffer_list,totalLength)方法
//注意点:如第一个参数是空数组或totalLength为0,则返回空的buffer对象
let buffer2=Buffer.from("全军出击");
let buffer3=Buffer.concat([buffer,buffer2]);
console.log(buffer3.toString()); // 王者荣耀ADCarry

//4.isEncoding()方法:查看指定字符串是否是编码集 如utf8
console.log(Buffer.isEncoding('utf8'));         // true
console.log(Buffer.isEncoding('utf16le'));      //true
console.log(Buffer.isEncoding('Hello World'));  //false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值