查看“Node.js:Buffer”的源代码
←
Node.js:Buffer
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Node.js]] == 关于 == JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像 TCP流 或 文件流 时,必须使用到二进制数据。 因此在 Node.js中,定义了一个 '''Buffer 类''',该类用来创建一个专门存放'''二进制'''数据的缓存区。 <pre> 在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。 </pre> * 一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。 * 在 v6.0 之前创建 Buffer 对象直接使用 new Buffer() 构造函数来创建对象实例,但是 Buffer 对内存的权限操作相比很大,可以直接捕获一些敏感信息,所以在 v6.0 以后,官方文档里面建议使用 '''Buffer.from()''' 接口去创建 Buffer 对象。 === Buffer 与字符编码 === Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换: <syntaxhighlight lang="JavaScript" highlight=""> const buf = Buffer.from('runoob', 'ascii'); // 输出 72756e6f6f62 console.log(buf.toString('hex')); // 输出 cnVub29i console.log(buf.toString('base64')); </syntaxhighlight> Node.js 目前支持的字符编码包括: * ascii:仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。 * utf8:多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。 * utf16le:2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。 * ucs2:(utf16le 的别名)。 * base64:Base64 编码。 * latin1:一种把 Buffer 编码成一字节编码的字符串的方式。 * binary:(latin1 的别名)。 * hex:将每个字节编码为两个十六进制字符。 == Buffer使用 == === 创建 Buffer 类 === Buffer 提供了以下 API 来创建 Buffer 类: * '''<code>Buffer.alloc(size[, fill[, encoding]])</code>''': 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0; * '''<code>Buffer.allocUnsafe(size)</code>''': 返回一个指定大小的 Buffer 实例,但是它'''不会被初始化''',所以它可能包含敏感的数据; * '''<code>Buffer.allocUnsafeSlow(size)</code>''': * '''<code>Buffer.from(array)</code>''': 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖); * '''<code>Buffer.from(arrayBuffer[, byteOffset[, length]])</code>''': 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer;【?】 * '''<code>Buffer.from(string[, encoding])</code>''': 返回一个被 string 的值初始化的新的 Buffer 实例; * '''<code>Buffer.from(buffer)</code>''': 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例; <syntaxhighlight lang="JavaScript" highlight=""> // 创建一个长度为 10、且用 0 填充的 Buffer。 const buf1 = Buffer.alloc(10); // 创建一个长度为 10、且用 0x1 填充的 Buffer。 const buf2 = Buffer.alloc(10, 1); // 创建一个长度为 10、且未初始化的 Buffer。 // 这个方法比调用 Buffer.alloc() 更快, // 但返回的 Buffer 实例可能包含旧数据, // 因此需要使用 “fill()” 或 “write()” 重写。 const buf3 = Buffer.allocUnsafe(10); // 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。 const buf4 = Buffer.from([1, 2, 3]); // 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。 const buf5 = Buffer.from('tést'); // 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。 const buf6 = Buffer.from('tést', 'latin1'); </syntaxhighlight> === 写入缓冲区 === 语法: '''<syntaxhighlight lang="JavaScript" highlight=""> buf.write(string[, offset[, length]][, encoding]) </syntaxhighlight>''' 参数: * string - 写入缓冲区的字符串。 * offset - 缓冲区开始写入的索引值,默认为 0 。 * length - 写入的字节数,默认为 buffer.length。 * encoding - 使用的编码。默认为 'utf8' 。 : 根据 encoding 的字符编码写入 string 到 buf 中的 offset 位置。 length 参数是写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则只会写入 string 的一部分。 只部分解码的字符不会被写入。 返回值: : 返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串。 示例: <syntaxhighlight lang="JavaScript" highlight=""> buf = Buffer.alloc(256); len = buf.write("www.runoob.com"); console.log("写入字节数 : "+ len); </syntaxhighlight> 执行以上代码,输出结果为: <syntaxhighlight lang="JavaScript" highlight=""> $node main.js 写入字节数 : 14 </syntaxhighlight> === 读取缓冲区 === 语法: '''<syntaxhighlight lang="JavaScript" highlight=""> buf.toString([encoding[, start[, end]]]) </syntaxhighlight>''' 参数: * encoding - 使用的编码。默认为 'utf8' 。 * start - 指定开始读取的索引位置,默认为 0。 * end - 结束位置,默认为缓冲区的末尾。 返回值: : 解码缓冲区数据并使用指定的编码返回字符串。 示例: <syntaxhighlight lang="JavaScript" highlight=""> 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)); //使用 'ascii' 编码, 并输出: abcde console.log( buf.toString('utf8',0,5)); // 使用 'utf8' 编码, 并输出: abcde console.log( buf.toString(undefined,0,5)); // 使用默认的 'utf8' 编码, 并输出: abcde </syntaxhighlight> 执行以上代码,输出结果为: <syntaxhighlight lang="JavaScript" highlight=""> $ node main.js abcdefghijklmnopqrstuvwxyz abcde abcde abcde </syntaxhighlight> === 将 Buffer 转换为 JSON 对象 === 语法: '''<syntaxhighlight lang="JavaScript" highlight=""> buf.toJSON() </syntaxhighlight>''' : 当字符串化一个 Buffer 实例时,“JSON.stringify()” 会隐式地调用该 toJSON()。【?】 返回值: : 返回 JSON 对象。 示例: <syntaxhighlight lang="JavaScript" highlight=""> 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); </syntaxhighlight> 执行以上代码,输出结果为: <syntaxhighlight lang="JavaScript" highlight=""> {"type":"Buffer","data":[1,2,3,4,5]} <Buffer 01 02 03 04 05> </syntaxhighlight> === 合并缓冲区 === 语法: '''<syntaxhighlight lang="JavaScript" highlight=""> Buffer.concat(list[, totalLength]) </syntaxhighlight>''' 参数: * list - 用于合并的 Buffer 对象'''数组列表'''。 * totalLength - 指定合并后Buffer对象的总长度。 返回值: : 返回一个多个成员合并的新 Buffer 对象。 示例: <syntaxhighlight lang="JavaScript" highlight=""> var buffer1 = Buffer.from(('菜鸟教程')); var buffer2 = Buffer.from(('www.runoob.com')); var buffer3 = Buffer.concat([buffer1,buffer2]); console.log("buffer3 内容: " + buffer3.toString()); </syntaxhighlight> 执行以上代码,输出结果为: <syntaxhighlight lang="JavaScript" highlight=""> buffer3 内容: 菜鸟教程www.runoob.com </syntaxhighlight> === 比较缓冲区 === * 该方法在 Node.js v0.12.2 版本引入; 语法: '''<syntaxhighlight lang="JavaScript" highlight=""> buf.compare(otherBuffer); </syntaxhighlight>''' 参数: * otherBuffer - 与 buf 对象比较的另外一个 Buffer 对象。 返回值: : 返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同。 示例: <syntaxhighlight lang="JavaScript" highlight=""> 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 + "之后"); } </syntaxhighlight> 执行以上代码,输出结果为: <syntaxhighlight lang="JavaScript" highlight=""> ABC 在 ABCD之前 </syntaxhighlight> === 拷贝缓冲区 === 语法: '''<syntaxhighlight lang="JavaScript" highlight=""> buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]]) </syntaxhighlight>''' 参数: * targetBuffer - 要拷贝的 Buffer 对象。 * targetStart - 拷贝在目标缓冲区的插入位置:数字, 可选, 默认: 0。 * sourceStart - 源缓冲区中拷贝的开始位置:数字, 可选, 默认: 0。 * sourceEnd - 源缓冲区中拷贝的结束位置:数字, 可选, 默认: buffer.length。 返回值: : 没有返回值。 示例: <syntaxhighlight lang="JavaScript" highlight=""> var buf1 = Buffer.from('abcdefghijkl'); var buf2 = Buffer.from('RUNOOB'); //将 buf2 插入到 buf1 指定位置上 buf2.copy(buf1, 2); console.log(buf1.toString()); </syntaxhighlight> 执行以上代码,输出结果为: <syntaxhighlight lang="JavaScript" highlight=""> abRUNOOBijkl </syntaxhighlight> === 裁剪缓冲区 === 语法: '''<syntaxhighlight lang="JavaScript" highlight=""> buf.slice([start[, end]]) </syntaxhighlight>''' 参数: * start - 裁剪开始位置:数字, 可选, 默认: 0 * end - 裁剪结束位置:数字, 可选, 默认: buffer.length 返回值: : '''返回一个新的缓冲区,它和旧缓冲区指向同一块内存''',但是从索引 start 到 end 的位置剪切。 示例: <syntaxhighlight lang="JavaScript" highlight=""> var buffer1 = Buffer.from('runoob'); // 剪切缓冲区 var buffer2 = buffer1.slice(0,2); console.log("buffer2 content: " + buffer2.toString()); </syntaxhighlight> 执行以上代码,输出结果为: <syntaxhighlight lang="JavaScript" highlight=""> buffer2 content: ru </syntaxhighlight> === 缓冲区长度 === 语法: '''<syntaxhighlight lang="JavaScript" highlight=""> buf.length; </syntaxhighlight>''' 返回值: : 返回 Buffer 对象所占据的内存长度。 示例: <syntaxhighlight lang="JavaScript" highlight=""> var buffer = Buffer.from('www.runoob.com'); // 缓冲区长度 console.log("buffer length: " + buffer.length); </syntaxhighlight> 执行以上代码,输出结果为: <syntaxhighlight lang="JavaScript" highlight=""> buffer length: 14 </syntaxhighlight> == 附:方法参考手册 == {| class="wikitable" ! 命令 !! 描述 |- | new Buffer(size) | 分配一个新的 size 大小单位为8位字节的 buffer。 * 注意, size 必须小于 kMaxLength,否则,将会抛出异常 RangeError。 * '''已废弃''':使用 Buffer.alloc() 代替(或 Buffer.allocUnsafe())。 |- | new Buffer(buffer) | 拷贝参数 buffer 的数据到 Buffer 实例。 * '''已废弃''':使用 Buffer.from(buffer) 代替。 |- | new Buffer(str[, encoding]) | 分配一个新的 buffer ,其中包含着传入的 str 字符串。 * encoding 编码方式默认为 'utf8'。 * '''已废弃''':使用 Buffer.from(string[, encoding]) 代替。 |- | buf.length | 返回这个 buffer 的 bytes 数。 * 注意这未必是 buffer 里面内容的大小。 * length 是 buffer 对象所分配的内存数,它不会随着这个 buffer 对象内容的改变而改变。 |- | buf.write(string[, offset[, length]][, encoding]) | 根据参数 offset 偏移量和指定的 encoding 编码方式,将参数 string 数据写入buffer。 * offset 偏移量默认值是 0,encoding 编码方式默认是 utf8。 * length 长度是将要写入的字符串的 bytes 大小,默认是 buffer.length - offset。 * 返回 number 类型,表示写入了多少 8 位字节流。 * 如果 buffer 没有足够的空间来放整个 string,它将只会只写入部分字符串。 |- | buf.writeUIntLE(value, offset, byteLength[, noAssert]) | 将 value 写入到 buffer 里, 它由 offset 和 byteLength 决定,最高支持 48 位无符号整数,小端对齐。 示例: <syntaxhighlight lang="JavaScript" highlight=""> const buf = Buffer.allocUnsafe(6); buf.writeUIntLE(0x1234567890ab, 0, 6); // 输出: <Buffer ab 90 78 56 34 12> console.log(buf); </syntaxhighlight> |- | buf.writeUIntBE(value, offset, byteLength[, noAssert]) | 将 value 写入到 buffer 里, 它由 offset 和 byteLength 决定,最高支持 48 位无符号整数,大端对齐。 示例: <syntaxhighlight lang="JavaScript" highlight=""> const buf = Buffer.allocUnsafe(6); buf.writeUIntBE(0x1234567890ab, 0, 6); // 输出: <Buffer 12 34 56 78 90 ab> console.log(buf); </syntaxhighlight> |- | buf.writeIntLE(value, offset, byteLength[, noAssert]) | 将 value 写入到 buffer 里,它由 offset 和 byteLength 决定,最高支持 48 位有符号整数,小端对齐。 |- | buf.writeIntBE(value, offset, byteLength[, noAssert]) | 将 value 写入到 buffer 里,它由 offset 和 byteLength 决定,最高支持 48 位有符号整数,大端对齐。 |- | buf.readUIntLE(offset, byteLength[, noAssert]) | 支持读取 48 位以下的无符号数字,小端对齐。 |- | buf.readUIntBE(offset, byteLength[, noAssert]) | 支持读取 48 位以下的无符号数字,大端对齐。 |- | buf.readIntLE(offset, byteLength[, noAssert]) | 支持读取 48 位以下的有符号数字,小端对齐。 |- | buf.readIntBE(offset, byteLength[, noAssert]) | 支持读取 48 位以下的有符号数字,大端对齐。 |- | buf.toString([encoding[, start[, end]]]) | 根据 encoding 参数(默认是 'utf8')返回一个解码过的 string 类型。 还会根据传入的参数 start (默认是 0) 和 end (默认是 buffer.length)作为取值范围。 |- | buf.toJSON() | 将 Buffer 实例转换为 JSON 对象。 |- | buf[index] | 获取或设置指定的字节。 返回值代表一个字节,所以返回值的合法范围是十六进制0x00到0xFF 或者十进制0至 255。 |- | buf.equals(otherBuffer) | 比较两个缓冲区是否相等,如果是返回 true,否则返回 false。 |- | buf.compare(otherBuffer) | 比较两个 Buffer 对象,返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同。 |- | buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]]) | buffer 拷贝,源和目标可以相同。 * targetStart(目标开始偏移)和 sourceStart(源开始偏移默认)都是 0。 * sourceEnd(源结束位置偏移)默认是源的长度 buffer.length 。 |- | buf.slice([start[, end]]) | 剪切 Buffer 对象,根据 start(默认是 0 ) 和 end (默认是 buffer.length ) 偏移和裁剪了索引。 * 负的索引是从 buffer 尾部开始计算的。 |- | buf.readUInt8(offset[, noAssert]) | 根据指定的偏移量,读取一个无符号 8 位整数。 |- | buf.readUInt16LE(offset[, noAssert]) | 根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数。 |- | buf.readUInt16BE(offset[, noAssert]) | 根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数,大端对齐。 |- | buf.readUInt32LE(offset[, noAssert]) | 根据指定的偏移量,使用指定的 endian 字节序格式读取一个无符号 32 位整数,小端对齐。 |- | buf.readUInt32BE(offset[, noAssert]) | 根据指定的偏移量,使用指定的 endian 字节序格式读取一个无符号 32 位整数,大端对齐。 |- | buf.readInt8(offset[, noAssert]) | 根据指定的偏移量,读取一个有符号 8 位整数。 |- | buf.readInt16LE(offset[, noAssert]) | 根据指定的偏移量,使用特殊的 endian 格式读取一个 有符号 16 位整数,小端对齐。 |- | buf.readInt16BE(offset[, noAssert]) | 根据指定的偏移量,使用特殊的 endian 格式读取一个 有符号 16 位整数,大端对齐。 |- | buf.readInt32LE(offset[, noAssert]) | 根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数,小端对齐。 |- | buf.readInt32BE(offset[, noAssert]) | 根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数,大端对齐。 |- | buf.readFloatLE(offset[, noAssert]) | 根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,小端对齐。 |- | buf.readFloatBE(offset[, noAssert]) | 根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,大端对齐。 |- | buf.readDoubleLE(offset[, noAssert]) | 根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,小端对齐。 |- | buf.readDoubleBE(offset[, noAssert]) | 根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,大端对齐。 |- | buf.writeUInt8(value, offset[, noAssert]) | 根据传入的 offset 偏移量将 value 写入 buffer。注意:value 必须是一个合法的无符号 8 位整数。 |- | buf.writeUInt16LE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。 * 注意:value 必须是一个合法的无符号 16 位整数,小端对齐。 |- | buf.writeUInt16BE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。 * 注意:value 必须是一个合法的无符号 16 位整数,大端对齐。 |- | buf.writeUInt32LE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式(LITTLE-ENDIAN:小字节序)将 value 写入buffer。 * 注意:value 必须是一个合法的无符号 32 位整数,小端对齐。 |- | buf.writeUInt32BE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式(Big-Endian:大字节序)将 value 写入buffer。 * 注意:value 必须是一个合法的有符号 32 位整数。 |- | buf.writeInt8(value, offset[, noAssert]) | |- | buf.writeInt16LE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。 * 注意:value 必须是一个合法的 signed 16 位整数。 |- | buf.writeInt16BE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。 * 注意:value 必须是一个合法的 signed 16 位整数。 |- | buf.writeInt32LE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。 * 注意:value 必须是一个合法的 signed 32 位整数。 |- | buf.writeInt32BE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。 * 注意:value 必须是一个合法的 signed 32 位整数。 |- | buf.writeFloatLE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。 * 注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 |- | buf.writeFloatBE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。 * 注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 |- | buf.writeDoubleLE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。 * 注意:value 必须是一个有效的 64 位double 类型的值。 |- | buf.writeDoubleBE(value, offset[, noAssert]) | 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。 * 注意:value 必须是一个有效的 64 位double 类型的值。 |- | buf.fill(value[, offset][, end]) | 使用指定的 value 来填充这个 buffer。 * 如果没有指定 offset (默认是 0) 并且 end (默认是 buffer.length) ,将会填充整个buffer。 |} 关于“noAssert”参数: * 默认是 false; * 若为 true 将不会验证 value 和 offset 偏移量参数:这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃; * 除非你对这个参数非常有把握,否则尽量不要使用。
返回至“
Node.js:Buffer
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息