纯 JavaScript 对 Unicode 友好但是无法很好地处理二进制数据。当我们面对类似 TCP 流或文件系统时,是需要处理八位流的。Node 有几种操作、创建以及消费八位流的策略。原始数据保存在 Buffer 类的实例中。一个 Buffer 实例类似于一个整数数组,但对应着 V8 堆之外的一个原始内存分配区域。一个 Buffer 的大小不可变。Buffer 类是一个全局的类,是一个比较罕见的不需要 require('buffer') 就可以使用的类。在Buffers和JavaScript string转换时,需要明确的一个编码方法。下面是一些不同的string编码。

  • 'ascii' - 仅适用 7 bit ASCII 格式数据。这个编码方式非常快速,而且会剥离设置过高的bit。
  • 'utf8' - 多字节编码 Unicode字符。很多网页或者其他文档的编码格式都是使用 UTF-8的。
  • 'utf16le' - 2 或者 4 字节, Little Endian (LE) 编码Unicode字符。 代理对 (U+10000 to U+10FFFF) 是支持的.(BE和LE表示大端和小端,Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端;Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端;下同)
  • 'ucs2' - 'utf16le'的别名.
  • 'ucs2' - 'utf16le'的别名.
  • 'binary' - 一个将原始2进制数据编码为字符串的方法,仅使用每个字符的前8bits。 这个编码方式已经被弃用而且应该被避免,尽可能的使用Buffer对象。这个编码方式将会在未来的Node版本中移除。
  • 'hex' - 把每个byte编码成2个十六进制字符

类: Buffer

Buffer 类是一个全局变量类型,用来直接处理2进制数据的。 它能够使用多种方式构建。

new Buffer(size)
  • size Number

分配一个新的 buffer 大小是 size 的8位字节.

new Buffer(array)
  • array Array

分配一个新的 buffer 使用一个8位字节 array 数组.

new Buffer(str, [encoding])
  • str String类型 - 需要存入buffer的string字符串.
  • encoding String类型 - 使用什么编码方式,参数可选.

分配一个新的 buffer ,其中包含着给定的 str字符串. encoding 编码方式默认是:'utf8'.

类方法: Buffer.isEncoding(encoding)

  • encoding {String} 用来测试给定的编码字符串

如果给定的编码 encoding 是有效的,返回 true,否则返回 false。

类方法: Buffer.isBuffer(obj)

  • obj Object
  • 返回: Boolean

测试这个 obj 是否是一个 Buffer.

类方法: Buffer.byteLength(string, [encoding])

  • string String类型
  • encoding String类型, 可选参数, 默认是: 'utf8'
  • Return: Number类型

将会返回这个字符串真实byte长度。 encoding 编码默认是: 'utf8'. 这个和 String.prototype.length 是不一样的,因为那个方法返回这个字符串中有几个字符的数量。 (译者:当用户在写http响应头Cotent-Length的时候,千万记得一定要用 Buffer.byteLength 方法,不要使用 String.prototype.length

类方法: Buffer.concat(list, [totalLength])

  • list {Array}数组类型,Buffer数组,用于被连接。
  • totalLength {Number}类型 上述Buffer数组的所有Buffer的总大小。(译者:注意这里的totalLength不是数组长度是数组里Buffer实例的大小总和)

返回一个保存着将传入buffer数组中所有buffer对象拼接在一起的buffer对象。(译者:有点拗口,其实就是将数组中所有的buffer实例通过复制拼接在一起)如果传入的数组没有内容,或者 totalLength 参数是0,那将返回一个zero-length的buffer。

如果数组中只有一项,那么这第一项就会被返回。如果数组中的项多于一个,那么一个新的Buffer实例将被创建。如果 totalLength 参数没有提供,虽然会从buffer数组中计算读取,但是会增加一个额外的循环来计算它,所以提供一个明确的 totalLength 参数将会更快。

buf.length
  • Number类型

这个buffer的bytes大小。注意这未必是这buffer里面内容的大小。length 的依据是buffer对象所分配的内存数值,它不会随着这个buffer对象内容的改变而改变。

buf.write(string, [offset], [length], [encoding])
  • string String类型 - 将要被写入 buffer 的数据
  • offset Number类型, 可选参数, 默认: 0
  • length Number类型, 可选参数, 默认: buffer.length - offset
  • encoding String类型, 可选参数, 默认: 'utf8'

根据参数 offset 偏移量和指定的encoding编码方式,将参数 string 数据写入buffer。 offset偏移量 默认是0, encoding编码方式默认是 'utf8'length长度是将要写入的字符串的bytes大小。 返回number类型,表示多少8位字节流被写入了。如果buffer 没有足够的空间来放入整个string,它将只会写入部分的字符串。length 默认是 buffer.length - offset。 这个方法不会出现写入部分字符。

buf = new Buffer(256);
len = buf.write('\u00bd + \u00bc = \u00be', 0);
console.log(len + " bytes: " + buf.toString('utf8', 0, len));
buf.toString([encoding], [start], [end])
  • encoding String类型, 可选参数, 默认: 'utf8'

  • start Number类型, 可选参数, 默认: 0
  • end Number类型, 可选参数, 默认: buffer.length

根据 encoding参数(默认是 'utf8')返回一个解码的 string 类型。还会根据传入的参数 start (默认是0) 和end (默认是 buffer.length)作为取值范围。

buf.toJSON()

返回一个 JSON表示的Buffer实例。JSON.stringify将会默认调用来字符串序列化这个Buffer实例

buf[index]

获取或者设置在指定index索引位置的8位字节。这个值是指单个字节,所以这个值必须在合法的范围,16进制的0x000xFF,或者0255

buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
  • targetBuffer Buffer 类型对象 - 将要进行拷贝的Buffer

  • targetStart Number类型, 可选参数, 默认: 0
  • sourceStart Number类型, 可选参数, 默认: 0
  • sourceEnd Number类型, 可选参数, 默认: buffer.length

进行buffer的拷贝,源和目标可以是重叠的。 targetStart 目标开始偏移 和sourceStart源开始偏移 默认都是0. sourceEnd 源结束位置偏移默认是源的长度 buffer.length.

如果传递的值是undefined/NaN 或者是 out of bounds 超越边界的,就将设置为他们的默认值。(译者:这个默认值下面有的例子有说明)

buf.slice([start], [end])
  • start Number类型, 可选参数, 默认: 0

  • end Number类型, 可选参数, 默认: buffer.length

返回一个新的buffer,这个buffer将会和老的buffer引用相同的内存地址,只是根据 start (默认是 0) 和end (默认是buffer.length) 偏移和裁剪了索引。 负的索引是从buffer尾部开始计算的。

修改这个新的buffer实例slice切片,也会改变原来的buffer

buf.readUInt8(offset, [noAssert])
  • offset Number类型

  • noAssert Boolean类型, 可选参数, 默认: false
  • Return: Number类型

从这个buffer对象里,根据指定的偏移量,读取一个 unsigned 8 bit integer整形。

设置参数 noAssert为true表示忽略验证offset偏移量参数。 这意味着 offset可能会超出buffer的末尾。默认是 false

buf.readUInt16LE(offset, [noAssert])
buf.readUInt16BE(offset, [noAssert])
  • offset Number类型

  • noAssert Boolean类型, 可选参数, 默认: false
  • Return: Number类型

从这个buffer对象里,根据指定的偏移量,使用特殊的 endian字节序格式读取一个 unsigned 16 bit integer。

设置参数 noAssert为true表示忽略验证offset偏移量参数。 这意味着 offset可能会超出buffer的末尾。默认是 false

buf.readUInt32LE(offset, [noAssert])#
buf.readUInt32BE(offset, [noAssert])
  • offset Number类型

  • noAssert Boolean类型, 可选参数, 默认: false
  • Return: Number类型

从这个buffer对象里,根据指定的偏移量,使用指定的 endian字节序格式读取一个 unsigned 32 bit integer。

设置参数 noAssert为true表示忽略验证offset偏移量参数。 这意味着 offset可能会超出buffer的末尾。默认是 false

buf.readInt8(offset, [noAssert])
  • offset Number类型

  • noAssert Boolean类型, 可选参数, 默认: false
  • Return: Number类型

从这个buffer对象里,根据指定的偏移量,读取一个 signed 8 bit integer。

设置参数 noAssert为true表示忽略验证offset偏移量参数。 这意味着 offset可能会超出buffer的末尾。默认是 false

buffer.readUInt8一样的返回,除非buffer中包含了有作为2的补码的有符号值。

buf.readInt16LE(offset, [noAssert])#
buf.readInt16BE(offset, [noAssert])
  • offset Number类型

  • noAssert Boolean类型, 可选参数, 默认: false
  • Return: Number类型

从这个buffer对象里,根据指定的偏移量,使用特殊的 endian字节序格式读取一个 signed 16 bit integer。

设置参数 noAssert为true表示忽略验证offset偏移量参数。 这意味着 offset可能会超出buffer的末尾。默认是 false

和 buffer.readUInt16一样返回,除非buffer中包含了有作为2的补码的有符号值。

buf.readInt32LE(offset, [noAssert])#
buf.readInt32BE(offset, [noAssert])
  • offset Number类型

  • noAssert Boolean类型, 可选参数, 默认: false
  • Return: Number类型

从这个buffer对象里,根据指定的偏移量,使用指定的 endian字节序格式读取一个 signed 32 bit integer。

设置参数 noAssert为true表示忽略验证offset偏移量参数。 这意味着 offset可能会超出buffer的末尾。默认是 false

和 buffer.readUInt32一样返回,除非buffer中包含了有作为2的补码的有符号值。

buf.readFloatLE(offset, [noAssert])#
buf.readFloatBE(offset, [noAssert])
  • offset Number类型

  • noAssert Boolean类型, 可选参数, 默认: false
  • Return: Number类型

从这个buffer对象里,根据指定的偏移量,使用指定的 endian字节序格式读取一个 32 bit float。

设置参数 noAssert为true表示忽略验证offset偏移量参数。 这意味着 offset可能会超出buffer的末尾。默认是 false

buf.readDoubleLE(offset, [noAssert])#
buf.readDoubleBE(offset, [noAssert])
  • offset Number类型

  • noAssert Boolean类型, 可选参数, 默认: false
  • Return: Number类型

从这个buffer对象里,根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 bit double。

设置参数 noAssert为true表示忽略验证offset偏移量参数。 这意味着 offset可能会超出buffer的末尾。默认是 false

buf.writeUInt8(value, offset, [noAssert])
  • value Number类型

  • offset Number类型
  • noAssert Boolean类型, 可选参数, 默认: false

根据指定的offset偏移量将value写入buffer。注意:value 必须是一个合法的unsigned 8 bit integer.

设置参数 noAssert为true表示忽略验证valueoffset参数。 这意味着 value可能过大,或者offset可能会超出buffer的末尾造成value被丢弃。 这个参数除了你非常有把握,否则不应该使用它。默认是 false。`

buf.writeUInt16LE(value, offset, [noAssert])#
buf.writeUInt16BE(value, offset, [noAssert])
  • value Number类型

  • offset Number类型
  • noAssert Boolean类型, 可选参数, 默认: false

根据指定的offset偏移量和指定的 endian字节序格式将value写入buffer。注意:value 必须是一个合法的unsigned 16 bit integer.

设置参数 noAssert为true表示忽略验证valueoffset参数。 这意味着 value可能过大,或者offset可能会超出buffer的末尾造成value被丢弃。 这个参数除了你非常有把握,否则不应该使用它。默认是 false。`.

buf.writeUInt32LE(value, offset, [noAssert])#
buf.writeUInt32BE(value, offset, [noAssert])
  • value Number类型

  • offset Number类型
  • noAssert Boolean类型, 可选参数, 默认: false

根据指定的offset偏移量和指定的 endian字节序格式将value写入buffer。注意:value 必须是一个合法的unsigned 32 bit integer。

设置参数 noAssert为true表示忽略验证valueoffset参数。 这意味着 value可能过大,或者offset可能会超出buffer的末尾造成value被丢弃。 这个参数除了你非常有把握,否则不应该使用它。默认是 false。`.

buf.writeInt8(value, offset, [noAssert])
  • value Number类型

  • offset Number类型
  • noAssert Boolean类型, 可选参数, 默认: false

根据指定的offset偏移量将value写入buffer。注意:value 必须是一个合法的 signed 8 bit integer。

设置参数 noAssert为true表示忽略验证valueoffset参数。 这意味着 value可能过大,或者offset可能会超出buffer的末尾造成value被丢弃。 这个参数除了你非常有把握,否则不应该使用它。默认是 false。`.

buffer.writeUInt8 一样工作,除非是把有2的补码的 signed integer 有符号整形写入buffer

buf.writeInt16LE(value, offset, [noAssert])#
buf.writeInt16BE(value, offset, [noAssert])
  • value Number类型

  • offset Number类型
  • noAssert Boolean类型, 可选参数, 默认: false

根据指定的offset偏移量和指定的 endian字节序格式将value写入buffer。注意:value 必须是一个合法的 signed 16 bit integer。

置参数 noAssert为true表示忽略验证valueoffset参数。 这意味着 value可能过大,或者offset可能会超出buffer的末尾造成value被丢弃。 这个参数除了你非常有把握,否则不应该使用它。默认是 false。`.

buffer.writeUInt16* 一样工作,除非是把有2的补码的 signed integer 有符号整形写入buffer

buf.writeInt32LE(value, offset, [noAssert])#
buf.writeInt32BE(value, offset, [noAssert])
  • value Number类型

  • offset Number类型
  • noAssert Boolean类型, 可选参数, 默认: false

根据指定的offset偏移量和指定的 endian字节序格式将value写入buffer。注意:value 必须是一个合法的 signed 32 bit integer。

设置参数 noAssert为true表示忽略验证valueoffset参数。 这意味着 value可能过大,或者offset可能会超出buffer的末尾造成value被丢弃。 这个参数除了你非常有把握,否则不应该使用它。默认是 false。`.

buffer.writeUInt32* 一样工作,除非是把有2的补码的 signed integer 有符号整形写入buffer

buf.writeFloatLE(value, offset, [noAssert])#
buf.writeFloatBE(value, offset, [noAssert])
  • value Number类型

  • offset Number类型
  • noAssert Boolean类型, 可选参数, 默认: false

根据指定的offset偏移量和指定的 endian字节序格式将value写入buffer。注意:当value 不是一个 32 bit float 类型的值时,结果将是不确定的。

设置参数 noAssert为true表示忽略验证valueoffset参数。 这意味着 value可能过大,或者offset可能会超出buffer的末尾造成value被丢弃。 这个参数除了你非常有把握,否则不应该使用它。默认是 false。`.

buf.writeDoubleLE(value, offset, [noAssert])#
buf.writeDoubleBE(value, offset, [noAssert])
  • value Number类型

  • offset Number类型
  • noAssert Boolean类型, 可选参数, 默认: false

根据指定的offset偏移量和指定的 endian字节序格式将value写入buffer。注意:value 必须是一个有效的 64 bit double 类型的值。

设置参数 noAssert为true表示忽略验证valueoffset参数。 这意味着 value可能过大,或者offset可能会超出buffer的末尾造成value被丢弃。 这个参数除了你非常有把握,否则不应该使用它。默认是 false。`.

buf.fill(value, [offset], [end])
  • value

  • offset Number类型, 可选参数
  • end Number类型, 可选参数

使用指定的value来填充这个buffer。如果 offset (默认是 0) 并且 end (默认是 buffer.length) 没有明确给出,就会填充整个buffer。 (译者:buf.fill调用的是C语言的memset函数非常高效)

var b = new Buffer(50);
b.fill("h");

buffer.INSPECT_MAX_BYTES

  • Number类型, 默认: 50

设置当调用buffer.inspect()方法后,多少bytes将会返回。这个值可以被用户模块重写。 (译者:这个值主要用在当我们打印console.log(buf)时,设置返回多少长度内容)

注意这个属性是require('buffer')模块返回的。这个属性不是在全局变量Buffer中,也不再buffer的实例里。

类: SlowBuffer

返回一个不被池管理的 Buffer

为了避免创建大量独立分配的 Buffer 带来的垃圾回收开销,默认情况下小于 4KB 的空间都是切割自一个较大的独立对象。这种策略既提高了性能也改善了内存使用,因为 V8 不需要跟踪和清理很多 Persistent 对象。

当开发者需要将池中一小块数据保留不确定的一段时间,较为妥当的办法是用 SlowBuffer 创建一个不被池管理的 Buffer 实例并将相应数据拷贝出来。

socket.on('readable', function() {
var data = socket.read();
// 为需要保留的数据分配内存
var sb = new SlowBuffer(10);
// 将数据拷贝到新的空间中
data.copy(sb, 0, 0, 10);
store.push(sb);
});

Buffer -nodejs的更多相关文章

  1. nodejs复习01

    console 格式化 console.log("%s:%s", "a", "b") //字符串 console.log("%d. ...

  2. 《深入浅出Nodejs》—— 读后总结

    这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完. 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的..... 什么是Nodejs Nodejs有几个特性:异步IO,事件驱动 ...

  3. 如何使用JavaScript实现纯前端读取和导出excel文件

    js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls.xlsx.ods(一种OpenOffice专 ...

  4. 如何使用JavaScript实现纯前端读取和导出excel文件(转)

    转自小茗同学博客:https://www.cnblogs.com/liuxianan/p/js-excel.html js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯 ...

  5. js-xlsx

    XLSX.read(data, {type: type}); type主要取值如下: base64: 以base64方式读取: binary: BinaryString格式(byte n is dat ...

  6. 前端Excel表格导入导出,包括合并单元格,表格自定义样式等

    表格数据导入 读取导入Excel表格数据这里采用的是 xlsx 插件 npm i xlsx 读取excel需要通过 XLSX.read(data, {type: type}) 方法来实现,返回一个叫W ...

  7. nodejs缓冲模块buffer相关资料

    buffer模块的详细使用教程 浅析nodejs的buffer类 深入浅出NodeJS--Buffer Node Buffer/Stream 内存策略分析

  8. 大熊君大话NodeJS之------Buffer模块

    一,开篇分析 所谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存. JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一 ...

  9. Nodejs Buffer

    javascript中的字符串本身就是以字符来存储,而非字节,下面的例子可以说明: console.log("0123456789".length); console.log(&q ...

随机推荐

  1. PCL—低层次视觉—点云分割(RanSaC)

    点云分割 点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现.不过多插一句,自Niloy J Mitra教授的Global contrast based salient region ...

  2. PHP工程师面临成长瓶颈

    作为开发中应用最广泛的语言之一,PHP有着大量的粉丝,那么你是一名优秀的程序员吗?在进行自我修炼的同时,你是否想过面对各种各样的问题,我该如何突破自身的瓶颈,以便更好的发展呢?PHP工程师面临成长瓶颈 ...

  3. objectC时间用法

    #define kDEFAULT_DATE_TIME_FORMAT (@"yyyy-MM-dd HH:mm:ss") //获取当前日期,时间+(NSDate *)getCurren ...

  4. Android权限安全(3)权限的分级和自定义权限

    Android的不同权限分级 Normal 一般apk都可以用, Dangerous 一般apk都可以用,但有提示 SignatureOrSystem 特定的private key签名的或系统的apk ...

  5. libmysqlclient.so.15: cannot open shared object file: No such file or directory

    错误: ./mafsInRegion: error while loading shared libraries: libmysqlclient.so.15: cannot open shared o ...

  6. Android Studio安装后第一次进不去

    Android Studio 安装后第一次进不去,因为检查到有更新的SDK,在下载.但是呢,没有FQ的情况下,无法下载下来,所以就卡住了. 那么解决方案就是让 Android Studio 第一次启动 ...

  7. Android开发之事件分发和Listener

    参考:http://blog.csdn.net/zhongkejingwang/article/details/38141719 http://blog.csdn.net/zhongkejingwan ...

  8. git版本库底层命令

    当我们在使用git的时候,有时候需要知道当前文件夹相对于工作目录根目录的相对路径等等,那么我们可以使用 git rev-parse 添加一个参数就可以实现,如: 显示当前仓库版本库 .git 目录所在 ...

  9. maven - setting.xml

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...

  10. android的ScaleGestureDetector缩放类详解

    文章由多出组合,它们来自: http://elvajxw.iteye.com/blog/1308452 http://www.cnblogs.com/lknlfy/archive/2012/03/11 ...