ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Node.js入门教程(十七):Buffer(缓冲区)

Node.js入门教程(十七):Buffer(缓冲区) 一、什么是 BufferJavaScript 语言自身只有字符串数据类型没有二进制数据类型。Node.js 中的Buffer 类是用于处理二进制数据的核心工具提供了对二进制数据的高效操作。Buffer 类在处理文件操作、网络通信、图像处理等场景中特别有用。Buffer 的特性特性说明二进制数据Buffer 对象是一个包含原始二进制数据的固定大小的数组每个元素占用一个字节8位适合处理文件内容、网络数据包等固定长度Buffer 对象的内容可以在创建后修改但其长度是固定的不能动态改变二、Buffer 与字符编码Buffer 实例一般用于表示编码字符的序列比如 UTF-8、UCS2、Base64 或十六进制编码的数据。通过使用显式的字符编码就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。const buf Buffer.from(runoob, ascii); // 输出 72756e6f6f62 console.log(buf.toString(hex)); // 输出 cnVub29i console.log(buf.toString(base64));Node.js 支持的字符编码编码说明ascii仅支持 7 位 ASCII 数据速度很快utf8多字节编码的 Unicode 字符许多网页和文档格式都使用 UTF-8utf16le2 或 4 个字节小字节序编码的 Unicode 字符ucs2utf16le 的别名base64Base64 编码latin1一种把 Buffer 编码成一字节编码的字符串方式binarylatin1 的别名hex将每个字节编码为两个十六进制字符三、创建 BufferBuffer 提供了以下 API 来创建 Buffer 类方法说明Buffer.alloc(size[, fill[, encoding]])创建长度为 size 字节的 Buffer每个字节的值为 0推荐Buffer.allocUnsafe(size)创建长度为 size 字节的 Buffer但可能包含旧数据更快但不安全Buffer.allocUnsafeSlow(size)分配给定大小的新 Buffer 实例但不对其进行初始化Buffer.from(array)返回一个被 array 的值初始化的新的 Buffer 实例Buffer.from(arrayBuffer[, byteOffset[, length]])返回与给定 ArrayBuffer 共享同一内存的 BufferBuffer.from(buffer)复制传入的 Buffer 实例的数据返回新的 Buffer 实例Buffer.from(string[, encoding])通过字符串创建 Buffer可指定编码默认为 UTF-8创建示例// 创建一个长度为 10、且用 0 填充的 Buffer const buf1 Buffer.alloc(10); // 创建一个长度为 10、且用 0x1 填充的 Buffer const buf2 Buffer.alloc(10, 1); // 创建一个长度为 10、且未初始化的 Buffer // 这个方法比 Buffer.alloc() 更快但可能包含旧数据 const buf3 Buffer.allocUnsafe(10); // 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer const buf4 Buffer.from([1, 2, 3]); // 创建一个包含 UTF-8 字节的 Buffer const buf5 Buffer.from(tést); // 创建一个包含 Latin-1 字节的 Buffer const buf6 Buffer.from(tést, latin1);四、写入缓冲区语法buf.write(string[, offset[, length]][, encoding])参数参数说明string写入缓冲区的字符串offset缓冲区开始写入的索引值默认为 0length写入的字节数默认为buffer.lengthencoding使用的编码默认为 utf8返回值返回实际写入的大小。如果 buffer 空间不足则只会写入部分字符串。示例buf Buffer.alloc(256); len buf.write(www.runoob.com); console.log(写入字节数 : len);执行以上代码输出结果为$ node main.js 写入字节数 : 14五、从缓冲区读取数据语法buf.toString([encoding[, start[, end]]])参数参数说明encoding使用的编码默认为 utf8start指定开始读取的索引位置默认为 0end结束位置默认为缓冲区的末尾返回值解码缓冲区数据并使用指定的编码返回字符串。示例buf Buffer.alloc(26); for (var i 0 ; i 26 ; i) { buf[i] i 97; } console.log(buf.toString(ascii)); // 输出: abcdefghijklmnopqrstuvwxyz console.log(buf.toString(ascii, 0, 5)); // 输出: abcde console.log(buf.toString(utf8, 0, 5)); // 输出: abcde console.log(buf.toString(undefined, 0, 5)); // 输出: abcde六、将 Buffer 转换为 JSON 对象语法buf.toJSON()当字符串化一个 Buffer 实例时JSON.stringify()会隐式地调用该toJSON()方法。示例const buf Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); const json JSON.stringify(buf); // 输出: {type:Buffer,data:[1,2,3,4,5]} console.log(json); const copy JSON.parse(json, (key, value) { return value value.type Buffer ? Buffer.from(value.data) : value; }); // 输出: Buffer 01 02 03 04 05 console.log(copy);七、缓冲区合并语法Buffer.concat(list[, totalLength])参数参数说明list用于合并的 Buffer 对象数组列表totalLength指定合并后 Buffer 对象的总长度返回值返回一个多个成员合并的新 Buffer 对象。示例var buffer1 Buffer.from(教程); var buffer2 Buffer.from(www.runoob.com); var buffer3 Buffer.concat([buffer1, buffer2]); console.log(buffer3 内容: buffer3.toString());执行以上代码输出结果为buffer3 内容: 教程www.chenbyte.cn八、缓冲区比较语法buf.compare(otherBuffer);参数参数说明otherBuffer与 buf 对象比较的另外一个 Buffer 对象返回值返回一个数字表示buf在otherBuffer之前、之后或相同。示例var buffer1 Buffer.from(ABC); var buffer2 Buffer.from(ABCD); var result buffer1.compare(buffer2); if (result 0) { console.log(buffer1 在 buffer2 之前); } else if (result 0) { console.log(buffer1 与 buffer2 相同); } else { console.log(buffer1 在 buffer2 之后); }执行以上代码输出结果为ABC在ABCD之前九、拷贝缓冲区语法buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])参数参数说明targetBuffer要拷贝的 Buffer 对象targetStart可选默认: 0sourceStart可选默认: 0sourceEnd可选默认:buffer.length返回值没有返回值。示例var buf1 Buffer.from(abcdefghijkl); var buf2 Buffer.from(RUNOOB); // 将 buf2 插入到 buf1 指定位置上 buf2.copy(buf1, 2); console.log(buf1.toString());执行以上代码输出结果为abRUNOOBijkl十、缓冲区裁剪语法buf.slice([start[, end]])参数参数说明start可选默认: 0end可选默认:buffer.length返回值返回一个新的缓冲区它和旧缓冲区指向同一块内存但是从索引start到end的位置剪切。示例var buffer1 Buffer.from(runoob); // 剪切缓冲区 var buffer2 buffer1.slice(0, 2); console.log(buffer2 content: buffer2.toString());执行以上代码输出结果为buffer2 content: ru十一、缓冲区长度语法buf.length;返回值返回 Buffer 对象所占据的内存长度。示例var buffer Buffer.from(www.runoob.com); // 缓冲区长度 console.log(buffer length: buffer.length);执行以上代码输出结果为buffer length: 14十二、Buffer 常用方法参考序号方法 描述1Buffer.from()- 从字符串、数组或 Buffer 创建 Buffer推荐2buf.length- 返回 buffer 的字节数3buf.write(string[, offset[, length]][, encoding])- 写入数据到 buffer4buf.toString([encoding[, start[, end]]])- 从 buffer 读取数据5buf.toJSON()- 将 Buffer 实例转换为 JSON 对象6buf.equals(otherBuffer)- 比较两个缓冲区是否相等7buf.compare(otherBuffer)- 比较两个 Buffer 对象8buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])- 拷贝缓冲区9buf.slice([start[, end]])- 裁剪缓冲区共享内存10Buffer.concat(list[, totalLength])- 合并缓冲区11buf.fill(value[, offset][, end])- 用指定值填充缓冲区12buf.readUInt8(offset[, noAssert])- 读取无符号 8 位整数13buf.readUInt16LE(offset[, noAssert])- 读取无符号 16 位整数小端14buf.readUInt16BE(offset[, noAssert])- 读取无符号 16 位整数大端15buf.readUInt32LE(offset[, noAssert])- 读取无符号 32 位整数小端16buf.readUInt32BE(offset[, noAssert])- 读取无符号 32 位整数大端17buf.readInt8(offset[, noAssert])- 读取有符号 8 位整数18buf.readInt16LE(offset[, noAssert])- 读取有符号 16 位整数小端19buf.readInt16BE(offset[, noAssert])- 读取有符号 16 位整数大端20buf.readInt32LE(offset[, noAssert])- 读取有符号 32 位整数小端21buf.readInt32BE(offset[, noAssert])- 读取有符号 32 位整数大端22buf.readFloatLE(offset[, noAssert])- 读取 32 位浮点数小端23buf.readFloatBE(offset[, noAssert])- 读取 32 位浮点数大端24buf.readDoubleLE(offset[, noAssert])- 读取 64 位双精度数小端25buf.readDoubleBE(offset[, noAssert])- 读取 64 位双精度数大端26buf.writeUInt8(value, offset[, noAssert])- 写入无符号 8 位整数27buf.writeUInt16LE(value, offset[, noAssert])- 写入无符号 16 位整数小端28buf.writeUInt16BE(value, offset[, noAssert])- 写入无符号 16 位整数大端29buf.writeUInt32LE(value, offset[, noAssert])- 写入无符号 32 位整数小端30buf.writeUInt32BE(value, offset[, noAssert])- 写入无符号 32 位整数大端31buf.writeInt8(value, offset[, noAssert])- 写入有符号 8 位整数32buf.writeInt16LE(value, offset[, noAssert])- 写入有符号 16 位整数小端33buf.writeInt16BE(value, offset[, noAssert])- 写入有符号 16 位整数大端34buf.writeInt32LE(value, offset[, noAssert])- 写入有符号 32 位整数小端35buf.writeInt32BE(value, offset[, noAssert])- 写入有符号 32 位整数大端36buf.writeFloatLE(value, offset[, noAssert])- 写入 32 位浮点数小端37buf.writeFloatBE(value, offset[, noAssert])- 写入 32 位浮点数大端38buf.writeDoubleLE(value, offset[, noAssert])- 写入 64 位双精度数小端39buf.writeDoubleBE(value, offset[, noAssert])- 写入 64 位双精度数大端十三、本章小结知识点说明Buffer 是什么Node.js 中处理二进制数据的核心工具创建 Buffer推荐使用Buffer.from()、Buffer.alloc()写入数据buf.write()将字符串写入缓冲区读取数据buf.toString()从缓冲区读取字符串合并与复制Buffer.concat()合并buf.copy()复制裁剪buf.slice()裁剪共享内存注意修改影响原 Buffer长度buf.length获取缓冲区字节数JSON 转换buf.toJSON()转换为 JSON 对象编码支持UTF-8、ASCII、Base64、Hex 等多种编码提示Buffer.allocUnsafe()虽然更快但可能包含旧数据使用前需要填充或覆盖。推荐在大多数场景下使用Buffer.alloc()或Buffer.from()以确保安全。
返回列表