深入浅出node.js学习笔记-Buffer对象

栏目: C++ · 发布时间: 5年前

内容简介:Buffer在node运行时自动加载,挂载到global对象上,所以使用不需要requireBuffer是一个类似Array的对象,但它主要操作字节。Buffer所占内存不通过V8分配,属于

Buffer在node运行时自动加载,挂载到global对象上,所以使用不需要require

Buffer是一个类似Array的对象,但它主要操作字节。

Buffer所占内存不通过V8分配,属于 堆外内存

Buffer类似于数组格式,内部元素是16进制的两位数,即0~255

Utf-8情况下,汉字占3位,符号和字母占一位

可通过下角标访问元素和赋值。

let buffer = new Buffer(100)
buffer[10] = -100 // 156 如果赋值比0小,则加上256
buffer[20] = 300 // 44 如果赋值比255大,则减去256
buffer[30] = 3.1415 // 3 小数则舍弃小数部分,保留整数
console.log(buffer[1]) //会打印一个0到255的随机值

Buffer内存分配不通过v8,是因为Buffer的性能相关部分是通过C++实现的,所以它的内存是通过c++层面实现的。

Buffer内存分配时,以 8kb 为界限

  • 小于8kb的为小Buffer:对于小Buffer对象,采用slab分配机制,c++先申请8kb的slab内存,如果该slab剩余空间足够,则在slab空间内分配内存给新的Buffer,如果不足,则申请新的slab空间。
  • 大于8kb的为大Buffer:大Buffer对象,将会直接分配一个SlowBuffer对象作为slab空间,该slab空间被大Buffer对象独占。

Buffer可以与字符串直接进行转换,支持以下格式

  • UTF-8
  • ACSII
  • UTF-16LE/UCS-2
  • Base64
  • Hex
  • Binary

Buffer对象尽量不要使用+运算符进行拼接,如下代码

const fs = require(‘fs’)
let rs = fs.createReadStream(’test.txt’)
let data = ‘'
rs.on(‘data’, function(chunk) {
    data += chunk
})
rs.on(‘end’, function() {
    console.log(data)
})

data += chunk这句话蕴含了toString()转换,等价于data = data.toString() + chunk.toString()

chunk为Buffer对象,如何内部含义宽字节编码,toString()就会导致乱码。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机程序设计艺术:第4卷 第4册(双语版)

计算机程序设计艺术:第4卷 第4册(双语版)

Donald E.Knuth / 苏运霖 / 机械工业出版社 / 2007-4 / 42.00元

关于算法分析的这多卷论著已经长期被公认为经典计算机科学的定义性描述。迄今已出版的完整的三卷组成了程序设计理论和实践的惟一的珍贵源泉,无数读者都赞扬Knuth的著作对个人的深远影响。科学家们为他的分析的美丽和优雅所惊叹,而从事实践的程序员们已经成功地应用他的“菜谱式”的解到日常问题上,所有人都由于Knuth在书中所表现出的博学、清晰、精确和高度幽默而对他无比敬仰。   为开始后续各卷的写作并更......一起来看看 《计算机程序设计艺术:第4卷 第4册(双语版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换