Buffer(缓冲器)

  • Buffer是用于处理二进制数据流的
  • 实例类似整数数组,大小固定(实例化之后,是多大就多大,不能进行变更)
  • C++代码在V8 对外分配物理内存
  • Buffer是全局变量,没必要使用require来引用
//常见一个规定长度,默认用0填充
console.log(Buffer.alloc(10));
console.log(Buffer.alloc(20));
// 用2填充
console.log(Buffer.alloc(5,2));
// 创建一个长度为 5、且未初始化的 Buffer。这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。
console.log(Buffer.allocUnsafe(5,2));
console.log(Buffer.from([1,2,3]));
console.log(Buffer.from('test'));
//指定编码
console.log(Buffer.from('test','base64'));

运行结果

静态的属性和方法(Buffer类本身的属性和方法)[常用的]

Buffer.byteLength & Buffer.isBuffer() & Buffer.concat()

// 实际占了几个字节
console.log(Buffer.byteLength('test'));
//一个中文三个字节
console.log(Buffer.byteLength('测试')); console.log(Buffer.isBuffer({}));
console.log(Buffer.isBuffer(Buffer.from([1,2,3]))); const buf1 = Buffer.from('This')
const buf2 = Buffer.from(' is ')
const buf3 = Buffer.from('a ')
const buf4 = Buffer.from('test ')
const buf5 = Buffer.from('!') const buf = Buffer.concat([buf1,buf2,buf3,buf4,buf5])
console.log(buf.toString());

运行结果:

实例的常用属性和方法(6种)

buf.length      buf.toString()     buf.fill()

buf.equals()   buf.indexOf()      buf.copy()

//1.buf.length
const buf = Buffer.from('This is a test!')
console.log(buf.length); //
const buf2 = Buffer.alloc(10);
const buf3 = Buffer.allocUnsafe(10); //默认不填充
buf2[0]=2
//下面证明,就算默认不填充,可是长度是根据你一开始创建的大小来控制,与填不填充内容无关
console.log(buf2.length); //
console.log(buf3.length); // //2.buf.toString()
console.log(buf.toString()); //默认utf-8 This is a test
console.log(buf.toString('base64')); //VGhpcyBpcyBhIHRlc3Qh //3.buf.fill() alloc是自动填充0,但是可以用fill()来填充其他的值
const buf4 = Buffer.allocUnsafe(10)
console.log(buf4);
console.log(buf4.fill(10,2,6));//fill(像填充的内容,从哪里开始,从哪里结束) //4.buf.equals() 两个Buffer的内容是否相等
const buf5 = Buffer.from('test')
const buf6 = Buffer.from('test')
const buf7 = Buffer.from('test!') console.log(buf5.equals(buf6)); //true
console.log(buf5.equals(buf7)); //false //5.buf.indexOf() buf5=test
console.log(buf5.indexOf('s')); //找到就返回所在位置的index(从0开始)
console.log(buf5.indexOf('a'));//找不到就返回-1 //6.buf.copy()
const buf8 = Buffer.allocUnsafe(10).fill('*')
const buf9 = Buffer.allocUnsafe(10).fill('!')
//拷贝'buf8'中第 3-6字节数据到'buf9'第4个偏移量开始
buf8.copy(buf9,4,3,6)
console.log(buf9.toString()); // !!!!***!!!
//乱码
const StringDecoder = require('string_decoder').StringDecoder
//自定义的decoder
const decoder = new StringDecoder('utf8')
const buf = Buffer.from('中文字符串!');
for(let i =0 ;i<buf.length ; i+=5){
const b = Buffer.allocUnsafe(5)
buf.copy(b,0,i)
console.log(b.toString());//乱码
 
}
for(let i =0 ;i<buf.length ; i+=5){
const b = Buffer.allocUnsafe(5)
buf.copy(b,0,i)
//用decoder来打印,决定打印的内容
console.log(decoder.write(b)); //没有乱码
}
//decoder并不会意识到自己处理中文(宽字节),
 

NodeJS3-2基础API----Buffer(缓冲器)的更多相关文章

  1. Linux高性能server编程——Linux网络基础API及应用

     Linux网络编程基础API 具体介绍了socket地址意义极其API,在介绍数据读写API部分引入一个有关带外数据发送和接收的程序,最后还介绍了其它一些辅助API. socket地址API 主 ...

  2. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  3. 服务器编程入门(4)Linux网络编程基础API

      问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字( ...

  4. Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址

    Android BLE与终端通信(一)--Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址 Hello,工作需要,也必须开始向BLE方向学习了,公司的核心技术就是BLE终端 ...

  5. Buffer --缓冲器

    一. 启动Buffer缓冲器 node 输入 buffer 创建一个新的buffer var buf = new buffer(''hello word) 查看buf的长度 buf.length 运行 ...

  6. node.js中Buffer缓冲器的使用

    一.什么是Buffer Buffer缓冲器是用来存储输入和输出数据的一段内存.js语言没有二进制数据类型,在处理TCP和文件流的时候,就不是很方便了. 所以node.js提供了Buffer类来处理二进 ...

  7. SVG 学习<四> 基础API

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  8. mongoose 基础api 图表整理

    一.背景 今天看 mongoose 的基础 API,参考了下面的链接做了图表以供查阅. 参考资料: http://www.cnblogs.com/xiaohuochai/p/7215067.html ...

  9. React实例入门教程(1)基础API,JSX语法--hello world

      前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发 ...

  10. 【原创】React实例入门教程(1)基础API,JSX语法--hello world

    前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发效率 ...

随机推荐

  1. Acquistion Location Confidence for accurate object detection

    Acquistion Location Confidence for accurate object detection 本论文主要是解决一下两个问题: 1.分类得分高的预测框与IOU不匹配,(我猜应 ...

  2. API更新#图书信息查询ISBN2.0

    ISBN图书查询     自2019年5月8日公布isbn查询接口1.0至今,该图书数据查询服务已被调用八万余次,查得图书11653本,感谢一直使用和关心这个接口的朋友们! 目前网站域名将于2019年 ...

  3. java中sleep()和wait()区别

    1,sleep方法是Thread类的静态方法,wait()是Object超类的成员方法 2,sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时 ...

  4. 实战webpack系列03

    03.Webpack的强大功能 一.生成Source Maps(使调试更容易) 通过简单的配置,webpack就可以在打包时为我们生成的source maps,这为我们提供了一种对应编译文件和源文件的 ...

  5. No provider available for the service com.xxx.xxx 错误解决

    HTTP Status 500 - Servlet.init() for servlet springmvc threw exception type Exception report message ...

  6. react中简单倒计时跳转

    其实在react中实现倒计时的跳转方法有很多中,其中我认为较为好用的就是通过定时器更改state中的时间值. 首先在constructor中设置10秒的时间值: constructor () { su ...

  7. 与karma、angular的第一次亲密接触

    首先要了解什么是karma,karma干嘛用的,它的好朋友jasmine又是啥?这些文章可以帮助你: karma干嘛的? angular与karma1 angular与karma2 看了以上几篇文章之 ...

  8. pikachu 暴力破解

    一 暴力破解 1.基于表单的暴力破解 先随意测试root/root登录,用Burp抓包,丢进Intruder 添加username和password两个参数变量,攻击类型选择Clusterbomb 有 ...

  9. 华为云ModelArts 2.0全面升级,革新传统AI开发模式

    [中国,上海,9月20日] 在HUAWEI CONNECT 2019期间,华为云EI服务产品部总经理贾永利宣布--华为云AI重装升级,并重磅发布一站式AI开发管理平台ModelArts 2.0. 现场 ...

  10. 一个普通程序员眼中的AQS

    AQS是JUC包中许多类的实现根基,这篇文章只是个人理解的产物,不免有误,若阅读过程中有发现不对的,希望帮忙指出[赞]! 1 AQS内脏图 ​  在开始了解AQS之前,我们先从上帝视角看看AQS是由几 ...