博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node-buffer解读
阅读量:5965 次
发布时间:2019-06-19

本文共 2723 字,大约阅读时间需要 9 分钟。

什么是Buffer

一个存储unicode码位的类数组对象,提供对数据内存申请、创建和操作的方法。类似于ArrayBuffer的直接视图

var buf = Buffer.from("123");console.log(buf); //
复制代码

主要作用

处理二进制

js语言自身只有字符串数据类型,没有二进制数据类型,而处理TCP和文件流的时候,必须处理二进制数据

大内存操作

内存分配

buffer对象内存实际分配不在 v8的堆内存中,而是由C++层实现内存的申请,采用的slab分配机制(大于8kb为大内存,否则就是小内存),所以是不占node运行的内存(node默认运行最大内存:64位,大约1.4G,32位:大约。0.7G)

小内存:每个小内存有3中状态(完全分配,部分分配,没有分配)。
  • 部分内存在Buffer.allocUnsafe()方法创建内存时,会有可能被存入新的数据,所以在新创建的内存会存有旧 的信息,所以是不安全。但是少了申请、创建过程所以会比Buffer.alloc创建的速度快很多。
  • 在内存的回收中,存有多个buffer对象在作用域都被释放是才能能被回收,所以Buffer.allocUnsafe()创建的buffer对象在内存回收是比较慢的
大内存:会直接分配一个 SlowBuffer对象,buffer模块可以直接访问和操作它,但是不推荐。

创建一个buffer

Buffer.alloc(size,[fill,encoding])

size:定义长度(定义后不可变)

fill:填充

encoding:编码类型

var buf = Buffer.alloc(9,"你好","utf-8")console.log(buf.toString()) //"你好你"复制代码
Buffer.allocUnsafe()

Buffer.alloc用法相同,最大的区别在于前者创建速度比后者快,但是后者创建时数据可能代用其他内存的信息,所以存在安全问题

Buffer.from()
  • Buffer.from(array) array:[unicode码位,unicode码位]

unicode码位:number类型

var arr = "buffer".split("").map(i=>i.charCodeAt())var buf = Buffer.from(arr)console.log(buf.toString()) //"buffer"复制代码
Buffer.from(arrayBuffer[, byteOffset[, ]])

会得到arrayBuffer的内存共享,

byteOffset:开始位置

length:共享的长度

var buffer = new ArrayBuffer(8);var view = new Int32Array(buffer);view[0] = 1000;var buf = Buffer.from(view.buffer);console.log(buf); //
view[0] = 2000;console.log(buf); //
console.log(view.buffer === buf.buffer ) //true复制代码
Buffer.from(object[, offsetOrEncoding[, length]])

object:支持 Symbol.toPrimitivevalueOf()的对象(number是不行的)

offsetOrEncoding:类型或者偏移量

length:长度

注意:由于new Buffer创建内存不确定可能带有其他数据,所以官方已经不推荐使用

Buffer的转换

buf.toString([encoding,start,end])
//字符串 =>Buffervar buf = Buffer.from("123");console.log(buf); //
//Buffer =>字符串console.log(buf.toString()) //"123"复制代码
支持类型
  • ASCII
  • UTF-8
  • UTF-16/UCS-2
  • Base64
  • Binary
  • Hex

通过Buffer.isEncoding(encoding)来判断

对于不支持的类型可以通过iconv(c++的libiconv)和iconv-list(纯js实现,少了转码,所以性能比较前者要高)

var icon = require("iconv-lite");var buf = icon.encode("123", "win1251");console.log(Buffer.isBuffer(buf)); //truevar str = icon.decode(buf, "win1251");console.log(str); //123复制代码
buffer.transcode(source, fromEnc, toEnc)

将一种编码转换到另一种编码

var buffer = require("buffer");var buf = Buffer.from("€");var rt = buffer.transcode(buf, "utf8", "ascii");console.log(rt.toString()); //"?"复制代码

Buffer的写入

buf.write(string[, offset[, length]][, encoding])
var buf = Buffer.alloc(10);buf.write("123")console.log(buf.toString()) //"123"复制代码

其他常用静态方法

Buffer.concat(list[, totalLength])
  • list: <Buffer[]> | <Uint8Array[]> 要合并的 Buffer 数组或 Uint8Array 数组。
  • totalLength: <integer> 合并后 Buffer 的总长度。
Buffer.compare(buf1, buf2)比较两个buffer对象

Buffer 实例方法属性

buf.equals(otherBuffer)

比较两个buffer对象是否相等

转载于:https://juejin.im/post/5c27395a5188250d9e60701c

你可能感兴趣的文章
【博客话题】技术人生之三界修炼
查看>>
Ext JS 6开发实例(三) :主界面设计
查看>>
Hyper-V 3中虚拟机CPU竞争机制
查看>>
【原创】Oracle RAC原理和安装
查看>>
东哥读书小记 之 《MacTalk人生元编程》
查看>>
《随机出题软件》&《随机分队软件》源码(Windows API)
查看>>
python 文件及文件夹操作
查看>>
Android自定义ListView的Item无法响应OnItemClick的解决办法
查看>>
Building Apps for Windows Phone 8.1教程下载地址整理
查看>>
移动Web—CSS为Retina屏幕替换更高质量的图片
查看>>
[Linux 性能检测工具]SAR
查看>>
JS 运行、复制、另存为 代码。
查看>>
一个经典编程面试题的“隐退”
查看>>
阿里公共DNS 正式发布了
查看>>
Java抓取网页数据(原网页+Javascript返回数据)
查看>>
[转载] 推荐的C++书籍以及阅读顺序
查看>>
EasyUI基础入门之Pagination(分页)
查看>>
ORACLE中CONSTRAINT的四对属性
查看>>
python 迭代器 生成器
查看>>
dorado基本事件样例
查看>>