资讯专栏INFORMATION COLUMN

Buffer 对象

宋华 / 2571人阅读

摘要:对象对象是处理二进制数据的一个接口。它是原生提供的全局对象,可以直接使用,不需要。自有的字符串远远不能满足这些要求,于是对象应运而生。的转换对象可以与字符串相互转换,目前支持的字符串编码类型有一下几种。

Buffer对象
Buffer对象是Node处理二进制数据的一个接口。它是Node原生提供的全局对象,可以直接使用,不需要require("buffer")。虽然javascript对于字符串的操作十分友好。但是,在node中,很多的操作都会处理大量的二进制数据,比如文件处理,网络协议处理,图片处理。javascript自有的字符串远远不能满足这些要求,于是Buffer对象应运而生。

模块

Buffer是一个典型的javascript和c++结合的模块,它将性能相关的部分用c++实现,而将非性能相关的部分用js实现。node在进程启动的时候就已经加载了Buffer,所以无需require。

内存分配

Buffer对象的内存分配不是在V8的堆内存中,而是在node的c++层面实现的内存的申请的。node采用了slab分配机制,动态内存管理,slab包含三种状态,slab具有如下三种状态:
full:完全分配状态
partial: 部分分配状态
empty:没有被分配状态 。
我们可以指定Buffer对象的大小

new Buffer(size)

node以8KB为界限区分Buffer是大对象还是小对象(Buffer.poolSize=8*1024),即8kb为slab单元大小,js以它为单元分配内存。

Buffer对象

Buffer对象类似于数组,它的元素为16进制的两位数,即0-255的数值。

上面的代码会,新建一个保存str字符串的buffer 对象。
使用指定的编码方式将字符串写入buffer,然后返回实际写入的大小。如果buffer 空间不足, 则只会写入部分字符串。在本例中使用"utf8"编码,这种方式不会写入半个字符。

Buffer的转换

Buffer对象可以与字符串相互转换,目前支持的字符串编码类型有一下几种。

ASCII

UTF-8

UTF-16LE/UCS-2

Base64

Binary

Hex

字符串转buffer,使用构造函数new Buffer(str,[encoding]),默认是UTF-8编码。
Buffer转字符串也很简单,Buffer对象的toString方法可以将Buffer转成字符串。

var buf = new Buffer("Buffer Test")
buf.toString()
Buffer拼接

正确的拼接方式是用一个数组来存储接收到的所有Buffer片段,并记录所有片段的总长度,然后调用Buffer的concat()方法生成一个合并的Buffer对象。

var chunks = []
var size = 0
res.on("data", function(chunk) {
    chunks.push(chunk)
    size += chunk.length
})
res.on("end", function() {
    var buf = Buffer.concat(chunks, size)
    var str = iconv.decode(buf, "utf8")
    console.log(str)
})

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92354.html

相关文章

  • Node.js学习之路04——Buffer对象与字符串

    摘要:对象与字符串对象的方法将对象中保存的数据转换为字符串第一个参数用于指定对象中保存的文字编码格式,默认参数值为第二个参数和第三个参数用于指定被转换数据的起始位置与结束位置,不包含结束位置对象的方法向已经创建的对象中写入字符串第一个参数为指定需 Buffer对象与字符串 1. Buffer对象的toString()方法 将Buffer对象中保存的数据转换为字符串 toString([e...

    dongfangyiyu 评论0 收藏0
  • Node.js学习之路03——Buffer类初识

    摘要:然而,在处理流或文件流时,必须要处理二进制数据。因此,在中,定义了一个类,该类用来创建一个专门存放二进制数据的缓存区。因为在计算字符串的长度时,以位子作为一个单位,而在计算缓存区的长度时,以字节作为一个单位。 buffer对象 1. 什么是buffer 在客户端Javascript脚本代码中,对于二进制数据没有提供一个很好的支持。然而,在处理TCP流或文件流时,必须要处理二进制数据...

    DobbyKim 评论0 收藏0
  • Node.js 中的缓冲区(Buffer)究竟是什么?

    摘要:在创建时大小已经被确定且是无法调整的,在内存分配这块是由层面提供而不是具体后面会讲解。在这里不知道你是否认为这是很简单的但是上面提到的一些关键词二进制流缓冲区,这些又都是什么呢下面尝试做一些简单的介绍。 showImg(https://segmentfault.com/img/remote/1460000019894717?w=1280&h=850); 多数人都拥有自己不了解的能力和机...

    scwang90 评论0 收藏0
  • Java IO (四) NIO

    摘要:前面说的输入输出流都是阻塞式的而且传统的输入输出流都是通过字节的移动来处理即使不直接处理字节底层还是依赖字节处理也就是说面向输输出系统一次只能处理一个字节所以效率并不高新概述新使用不同的方式来处理输入输出采用内存映射文件的方式来处理输入输出 前面说的输入输出流都是阻塞式的.而且传统的输入输出流都是通过字节的移动来处理(即使不直接处理字节,底层还是依赖字节处理),也就是说面向输输出系统一...

    zengdongbao 评论0 收藏0
  • node事件循环 EventEmitter 异步I/O Buffer缓冲区 模块

    摘要:一个匿名函数,执行,事件全部完成,执行最后一句,程序执行完毕。这个事件的监听器为一个匿名函数,事件名称为,当秒以后被触发先对象发送一个事件触发了匿名函数即监听器,监听器被执行。 node.js事件循环 node.js单进程,单线程的程序每一个api都支持回调所有的事件机制都是设计模式中的 一共是23种设计模式 http://design-patterns.readth...一个对象发生...

    SexySix 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<